値ベース・クラス
java.lang.Integer
やjava.time.LocalDate
など、一部のクラスはvalue-basedです。 値ベースのクラスには、次のプロパティがあります:
- クラスは、finalインスタンス・フィールド(ただし、これらには可変オブジェクトへの参照が含まれている場合があります)のみを宣言
equals
、hashCode
およびtoString
のクラス実装では、その結果はインスタンス・アイデンティティからではなく、クラス・インスタンス・フィールド(参照するオブジェクトのメンバー)の値からのみコンピュートされます- クラス・メソッドは、同等の場合にインスタンスを「自由に置換可能」として処理します。つまり、
equals()
に応じて同等の2つのインスタンスx
およびy
を交換しても、クラス・メソッドの動作に可視の変更は生成されません - クラスはインスタンス・モニターを使用して同期を実行しません
- クラスが(またはは非推奨になりました)でアクセス可能なコンストラクタを宣言していない
- クラスは、各メソッド・コール・インで一意のアイデンティティを約束するインスタンス作成メカニズムを提供しません。特に、ファクトリ・メソッド規約では、
equals()
に従って独立して生成された2つのインスタンスが等しい場合は、==
に応じて同等になる可能性があります - クラスはfinalであり、インスタンス・フィールドまたはインスタンス・イニシャライザを宣言せず、コンストラクタが空である抽象クラスの
Object
または階層を拡張します。
値ベース・クラスの2つのインスタンスが(equalsに準拠)と等しい場合、プログラムでは、同期、アイデンティティ・ハッシュ、直列化またはその他のアイデンティティ依存のメカニズムに対する参照の等価性を介して直接、または間接的に、それらのアイデンティティを区別しないでください。
関連付けられたモニターの排他的所有権をプログラマが保証することはできないため、値ベース・クラスのインスタンスの同期は強くお薦めしません。
値ベース・クラスのアイデンティティ関連の動作は、将来のリリースで変更される可能性があります。 たとえば、同期が失敗する場合があります。