Value object
C++では、代入演算子をオーバーロードし、フィールド(コンストラクターの初期化子リストによって一度だけ評価される)とクラスのメソッドに適切なconst制約を使用することで値オブジェクトを構築できる。
ただし、フィールド自体をconstとして宣言した場合(つまり非constフィールドとgetterの組み合わせで実現する方法でなかった場合)、そのようなValue Objectは別のValue Objectで完全に上書きすることは不可能となる( object1 = object2 )。
C#やC++とは異なり、Javaは言語レベルでのカスタム値型をサポートしていない。カスタム値型のサポートの拡張は検討されているが、すべてのカスタム型は参照型であるため、同一性と参照のセマンティクスを持つ。
したがって、Javaプログラマーは、不変オブジェクトを作成することによって値オブジェクトをエミュレートする事になるオブジェクトの状態が変わらない限りにおいて、参照を渡すことは、Value Objectをコピーすることと意味的に同等となるからである。
すべての属性を空白のfinal として宣言し、すべての属性をArrayListまたはDateのような可変タイプのような可変タイプではなく不変タイプ(たとえば、String、Integer、またはこれらの規則に従って宣言された他のタイプ)とする。また、参照ではなく値を比較するために、equalsとhashCodeを定義するべきである。
「VALJO」(VALue Java Object)という用語は、正しく定義された不変Value Objectに必要な、より厳密なルールのセットを指すために作られた。
値オブジェクトは、Java14以降データレコードとして使用可能である