質問: new ValueObject(30); } void setValue(int a) { //ここのやり方がわからない } ValueObject getValue() { return vo.copy(); } } ```
回答: 下のようなイメージとなります。 ``` public class EntityObject { private final int id; private ValueObject vo; EntityObject(int id,ValueObject value) { this.id=id; vo = value; } void setValue(int a) { vo = new ValueObject(a); } ValueObject getValue() { return vo.copy(); } } ``` 「ValueObjectの変更が不可能」というのは、`ValueObject`オブジェクトの属性`b`の値を変更することができない(ように実装する)、という意味です。 質問文中のコードは、`ValueObject`型属性の参照先を変更しないようにする意図があるように見えますが、そういうわけではありません。 > > ・Entity Object > > ・不変な識別(IDなど)できるものがあり > > ・その他の属性は変更可能 > > > と書かれている通り、変更は可能です。 以下、質問からは少し外れるのですが、実際には以下の様な形のsetter/getterになるのが自然かと思います。 ``` void setValue(ValueObject value) { vo = value; } ValueObject getValue() { return vo; } ``` * setする型とgetする型が揃っている * バリューオブジェクトは不変であるため必ずしも新しいインスタンスを生成する必要はない という理由からです。