デフォルトのsetX
関数はX = _x
を使用していますが、Javaではそれは_x
オブジェクトへの参照に過ぎません。Java - セッターでnew()を使うべきかどうか?
代わりにX = new X(_x)
を使用しないでください。
私は本当に答えを探して、見つけていません。
デフォルトのsetX
関数はX = _x
を使用していますが、Javaではそれは_x
オブジェクトへの参照に過ぎません。Java - セッターでnew()を使うべきかどうか?
代わりにX = new X(_x)
を使用しないでください。
私は本当に答えを探して、見つけていません。
意味的には、_x
はオブジェクトではなく、パラメータであり、オブジェクトを参照しています。そして、その後、あなたのX
はその参照のコピーになるので、同じオブジェクトを指します。
しかし、それはあなたが達成したいものです。値を設定するたびに新しいオブジェクトを生成する必要はありません。そして、しばしば、あなたはそれがまったく同じオブジェクトであることを明示的に望みます。
呼び出し元のサイトがそのオブジェクトのバージョンをプライベートプロパティと見なした場合にのみ、それは代わりにコピーを作成して設定する責任があるということです。
名前セッターは、フィールドを設定することを意味します。
このメソッドはstoreCopyOf()と呼ばれていません。
新しい(対応するクラスにコピーコンストラクタが用意されている場合)を使用することはできますが、セッターで行うことは一般的ではありません。また、示されているように、そうすることは、setX()という名前が通信するという意味では非常に誤解を招きます。
代わりに
X = new X(_x)
を使用しないでください。
いいえ、すべきではありません。 APIのユーザーは、指定されたインスタンスをコピーするのではなく、正確に設定する必要があります。
あなたのニーズに合わない場合は例外をスローすることでこの入力インスタンスを検証できますが、コピーを設定するのは実際は不明です。
おそらく、この方法を使用してゲッターから値を返すことができます。参照型の内部フィールドのコピーを返すことは、不変性を維持するための良いテクニックです。
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");
コピーコンストラクタで値を再作成するには、その値の変更がローカルコピーに影響しないようにします。
変更可能(変更可能)のオブジェクトを設定していてもコピーを変更しない場合は、セッターでコピーコンストラクタを使用する必要があります。しかし、私はその設定と呼ぶことをためらっています。それはもっと似ていますsaveCopy(_x);
"それは単に_xオブジェクトへの参照ではないでしょうか?"はい。 "代わりにX =新しいX(_x)を使用してはいけませんか?" a) 'X'がそのようなコンストラクタを持っているかどうか、(b)あなたが実際に新しいインスタンスを必要とするかどうか(例えば防御的なコピー)。 –
YourClass yourClass = new YourClass(); yourClass.setX(_x)。コードを投稿できますか? –
既存のオブジェクトインスタンスへの参照が必要な場合はどうしたらよいですか?新しいインスタンスが必要かどうかは、シナリオによって異なります。 –