値ベース・クラス

java.util.Optionaljava.time.LocalDateTimeなどの一部のクラスは値ベースです。 値ベース・クラスのインスタンスは:
  • finalかつ不変(ただし、可変オブジェクトへの参照を含むことができる)。
  • equalshashCode、およびtoStringの実装を持つ(インスタンスの状態からのみ計算される、識別情報あるいは他のオブジェクトまたは変数の状態からは計算されない)
  • インスタンス間の参照等価性(==)、インスタンスのIDハッシュ・コード、またはインスタンスの固有ロックでの同期など、ID依存操作を使用しない。
  • 参照等価性(==)ではなくequals()のみに基づいて同等と見なされる。
  • アクセス可能なコンストラクタはありませんが、返されるインスタンスのアイデンティティをコミットしないファクトリ・メソッドを介してインスタンス化されます。
  • 同等のときに自由に置換可能。つまり、計算またはメソッド呼び出しでequals()に基づいて等しい任意の2つのインスタンスxyを交換しても、動作の表面上の変化は起きない。

プログラムは、値ベース・クラスの同等の値に対する2つの参照を区別しようとした場合、参照等価性に基づいて直接的に、あるいは同期、IDハッシュ、直列化、または他のID依存メカニズムに基づいて間接的に、のどちらの場合でも、予期できない結果を生成する可能性があります。 こうしたID依存操作を値ベース・クラスのインスタンスで使用すると、予測できない影響が生じることがあるため、回避するようにしてください。