値オブジェクト モデル・実装
値オブジェクトについて、モデル・実装面で注意することは、"不変であること"1点ですね。
値オブジェクトが不変であることは概念的には、
値オブジェクトはいわゆる物なので、一度オブジェクトを作ったら変更しないのが原則。都道府県で言えば、「東京都」は「宮崎県」に変更できないということです。
と前回確認したとおりですが、実装面では、変更の管理が単純である。という利点があるでしょう。
不変でない場合、メモリ上参照先が同じオブジェクトを複数作ってしまった場合、片方が変更された場合、元も変更されてしまいます。しばしば、それは意識しないところで不意にやられてしまうことがあります。
しかも、これってなかなか見つけづらいんですよね・・・
以下は、実装例です
MailAddress.java
class MailAddress{
final String value;
MailAddress(String value){
this.value = value;
}
MailAddress modify(String newValue){
return new MailAddress(newValue)
}
int hashCode(){
...
}
boolean equals(Object other){
...
return this.value.equals(other.value)
}
}
equalsの実装は属性の値が一致していればtrueになるようにしています。メールアドレスの値が同じならば、当然同じであるはずですよね。