2017-05-26 7 views
1

デフォルトのsetX関数はX = _xを使用していますが、Javaではそれは_xオブジェクトへの参照に過ぎません。Java - セッターでnew()を使うべきかどうか?

代わりにX = new X(_x)を使用しないでください。

私は本当に答えを探して、見つけていません。

+1

"それは単に_xオブジェクトへの参照ではないでしょうか?"はい。 "代わりにX =新しいX(_x)を使用してはいけませんか?" a) 'X'がそのようなコンストラクタを持っているかどうか、(b)あなたが実際に新しいインスタンスを必要とするかどうか(例えば防御的なコピー)。 –

+0

YourClass yourClass = new YourClass(); yourClass.setX(_x)。コードを投稿できますか? –

+0

既存のオブジェクトインスタンスへの参照が必要な場合はどうしたらよいですか?新しいインスタンスが必要かどうかは、シナリオによって異なります。 –

答えて

3

意味的には、_xはオブジェクトではなく、パラメータであり、オブジェクトを参照しています。そして、その後、あなたのXはその参照のコピーになるので、同じオブジェクトを指します。

しかし、それはあなたが達成したいものです。値を設定するたびに新しいオブジェクトを生成する必要はありません。そして、しばしば、あなたはそれがまったく同じオブジェクトであることを明示的に望みます。

呼び出し元のサイトがそのオブジェクトのバージョンをプライベートプロパティと見なした場合にのみ、それは代わりにコピーを作成して設定する責任があるということです。

3

名前セッターは、フィールドを設定することを意味します。

このメソッドはstoreCopyOf()と呼ばれていません。

新しい(対応するクラスにコピーコンストラクタが用意されている場合)を使用することはできますが、セッターで行うことは一般的ではありません。また、示されているように、そうすることは、setX()という名前が通信するという意味では非常に誤解を招きます。

2

代わりにX = new X(_x)を使用しないでください。

いいえ、すべきではありません。 APIのユーザーは、指定されたインスタンスをコピーするのではなく、正確に設定する必要があります。

あなたのニーズに合わない場合は例外をスローすることでこの入力インスタンスを検証できますが、コピーを設定するのは実際は不明です。

おそらく、この方法を使用してゲッターから値を返すことができます。参照型の内部フィールドのコピーを返すことは、不変性を維持するための良いテクニックです。

1

encapsulationを実装するためにsetter(およびgetter)メソッドを使用します。

例:

private String myField; //"private" means access to this is restricted 

public String getMyField() 
{ 
    //include validation, logic, logging or whatever you like here 
    return this.myField; 
} 
public void setMyField(String value) 
{ 
    //include more logic 
    this.myField = value; 
} 

のようなあなたのAPI Sを使用している誰かが、必要に応じてこれらの値を渡します:xはプリミティブ型である場合には、必要がない

obj.setMyField("myvalue"); 
1

コピーコンストラクタで値を再作成するには、その値の変更がローカルコピーに影響しないようにします。

変更可能(変更可能)のオブジェクトを設定していてもコピーを変更しない場合は、セッターでコピーコンストラクタを使用する必要があります。しかし、私はその設定と呼ぶことをためらっています。それはもっと似ていますsaveCopy(_x);

関連する問題