不変クラスの作成中、値を変更できないように、すべてのフィールドが final として宣言されます。これは問題ありませんが、なぜそれらを非公開として宣言するのでしょうか?
3 に答える
フィールドが変更可能なオブジェクトへの参照である場合、それを作成すると、参照が別のオブジェクトに再バインドfinal
されるのを防ぐことができます。ただし、オブジェクトを変更することはできますが、実際には、含まれているオブジェクトの不変性を回避できます。
これを防ぐために、フィールドを作成できますprivate
(フィールドが表示されない場合、フィールドを変更することはできません)。
例えば:
public class Order {
public final List<OrderLine> order_lines = ...;
}
ここでは、注文行を追加/削除/変更することで、誰でも注文を変更できorder_lines
ますfinal
。
不変オブジェクトは、作成後に変更することはできませんが、すべてのクライアントにエクスポートする必要がある単純な実装が必ずしも必要というわけではありません。例として、String
タイプを取り上げます。これは、多くのクレイジーな舞台裏の最適化を使用して、一般的なケース (たとえば、使用時にバッキング配列を共有するsubstring
) の効率を最大化します。クラスのすべてのフィールドを非表示にすることにより、実装は、時間またはスペースを節約する最適化を利用し、パブリック インターフェイスを介して格納されたデータへのアクセスを仲介しようとすることができます。これらのフィールドが公開されている場合、事後に実装を変更することは (不可能ではないにしても) 困難です。
つまり、不変性はカプセル化を意味するものではなく、その逆もありません。
お役に立てれば!
public class Person{
public Date birthDate = new Date(615666470l);
}
その後、誰でも生年月日を外部から更新できます。
Person porfiriopartida = new Person();
porfiriopartida.birthDate=new Date(931199270);
コンストラクターに必要な開始属性を提供し、値への参照のみを許可すると、それが機能します。
また、get メソッドで実際のオブジェクトを返さないことを忘れないでください (少なくともそれ自体は不変です)。