1

http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.htmlから:

「セッター」メソッド (フィールドまたはフィールドによって参照されるオブジェクトを変更するメソッド) を提供しないでください。すべてのフィールドを final および private にします。サブクラスがメソッドをオーバーライドすることを許可しないでください。これを行う最も簡単な方法は、クラスを final として宣言することです。より洗練されたアプローチは、コンストラクターをプライベートにし、ファクトリー メソッドでインスタンスを構築することです。インスタンス フィールドに変更可能なオブジェクトへの参照が含まれている場合は、それらのオブジェクトの変更を許可しないでください。変更可能なオブジェクトを変更するメソッドを提供しないでください。変更可能なオブジェクトへの参照を共有しないでください。コンストラクターに渡された外部の変更可能なオブジェクトへの参照を保存しないでください。必要に応じて、コピーを作成し、コピーへの参照を保存します。同様に、

Employee というクラスにはAddress My Question 型のインスタンス変数a
があり ます: このクラスを不変にするにはどうすればよいですか (条件: getAddress() getter から同じインスタンス変数aを返したい)。
アドレス クラスを不変にする必要がありますか?

注: 防御コピーについては理解していますが、これは使用したくありません

4

3 に答える 3

0

はい、 field に格納されている同じインスタンスを返したい場合はa、 Employee クラスを不変にするために、 Address クラスを不変にする必要があります。

フィールドに格納されているインスタンスのコピーを作成してaそれを返す場合は、そうする必要はありません。

于 2013-05-19T19:07:12.997 に答える
0

Employee というクラスには Address My Question 型のインスタンス変数 a があります: このクラスを不変にするにはどうすればよいですか (条件: getAddress() getter から同じインスタンス変数 a を返したい)。

ゲッターでまったく同じ変数を返したい場合は、そこにコピーを使用できません。しかし、おそらくクラスequals()のメソッドを実装する必要がありますか? Addressインスタンスの等価性に依存するよりもはるかに優れているようです。そのときは、コピーを使用して幸せになることができます。

アドレス クラスを不変にする必要がありますか?

それがあなたがやりたいようにそれを行う唯一の方法です。Addressそれでも、不変のフィールドを作成する必要があります。文字列はデフォルトで不変であり、EMUN も同様です。何か他のものを返したい場合は、防御的なコピーを使用する必要があります。

于 2013-05-19T19:07:01.277 に答える
0

従業員の住所を最終変数として作成できるため、コンストラクターの実行が終了する前にインスタンス化する必要があります。そのため、従業員のコンストラクターを変更して、常にアドレスパラメーターをインスタンスアドレス変数の初期値にすることができます。一度設定すると、すでに初期化されているアドレス変数に新しいアドレス obj を割り当てることはできません。

于 2013-05-19T19:03:39.823 に答える