2013-08-22 8 views
5

私は、この値を設定した範囲に保つために処理したいint型の単一の値を持つカスタムオブジェクトを持っています。私の質問はこれです:次のクラスが与えられたら、myObject = 0で値を設定できますか?Javaで '='演算子を使用してカスタムクラスオブジェクトの値を設定する

代わりにメソッドpublicボイドsetBarを作成する
public class foo{ 
    private int bar; 
    public foo(){ 
    } 
} 

()

+3

いいえ、できません。 –

答えて

4

ありません、あなたはそれを行うことはできません。 Javaは演算子のオーバーロードをサポートしていません。 +演算子は文字列連結を実行するためにオーバーロードされますが、これは唯一の例外です。 =演算子を使用するもう1つの例は、ラッパークラスの場合です。プリミティブ型の値をラッパータイプに直接割り当てることができます。これにより、プリミティブ値がラッパータイプに自動ボックス化されます。

Integer val = 10; // 10 is auto-boxed to Integer reference 

しかし、それはその目的にのみ限定されています。独自のユーザー定義型では、この操作を行うことはできません。

メソッドの作成が唯一の選択肢です。

5

あなたが意味する場合:

foo x = new foo(); 
x = 10; // This is meant to set x.bar 

そして、いや、あなたはJavaでそれを行うことはできません。あなたも私に尋ねると良いことです...可読性の面では恐ろしいでしょう。

あなたができるようにそれを変更することはできません。と同等として

foo x = 10; 

foo x = new foo(); 
x.bar = 10; // Or x.setBar(10); 
+0

行列を使って作業するのはいいと思うが、明らかにこの例ではない。 – sdasdadas

+0

barのアクセス修飾子は公開されていないので、x.barを設定したい場合にも変更する必要があります。 –

+0

@ShivaKumar:私はそのように仮定していました。コードは同じクラスから呼び出すことができますが、もちろん:) –

0

をいいえ、それはカプセル化ロジック、およびJavaそのものに反します。ここで

1

Foo myObject = new Foo();

myObjectは、参照を保持しています。オブジェクト参照に0などのプリミティブ値を代入することはできません。

代わりに、あなたはJavaではmyObject.setBar(10);

0

を行う必要があり、大会は、オブジェクトの内部の属性を変更するにはセッターとゲッターを提供することです。あなたのケースのために:

foo instance = new foo(); 
instance.setBar(10); //Sets bar to 10 
instance.getBar(); //returns bar's current value (right now 10) 

セッターは、新しい値を受け取り、それを設定します。

public void setBar(int newBar) { 
    bar = newBar; 
} 

とゲッターは、フィールドの現在の値にアクセスすることができます:

public int getBar() { 
    return bar; 
} 

あなたがすることはできません、しかし、少なくとも、Javaの場合はと同じように=演算子をオーバーロードします。たとえば、IntegerFloatラッパークラスについて考えているなら、そこにはJavaの実装そのものに関連するもう1つの力があり、後でボクシングという概念で派生します。

+1

'foo.setBar(10)'や 'instance.setBar(10)'と言っていますか? –

+0

@VikasVよく見つかった。修正しました。 – Gamb

+1

補足として:Javaの命名規則に従ってください。クラスは大文字で始まる必要があります。 – Gamb

0

おそらく、このフィールドを公開することができます。ビジネスメソッドで必要な検証を行うだけで済みます(セット中は不要です)。

+0

これは私が考えていたものですが、私の質問は、コンストラクタ内部で何らかのリスナーを公開フィールドに置くことができるため、手動で何かを呼び出さなくてもすぐに処理を行うことができます。 process()メソッド? – Xandor