46. •
• DI
• VO Factory Builder
Address address = new Address.Builder(Pref.TOKYO).withCity(“
”).withAddress(” 5-6-12”).withBuildingName(“
7F”).build();
• Scala
class List(...) { }
object List{ def apply(...){ new List(...) } }
val list = List(1,2,3)
OR MapperなどのDaoやエンティティ(後で説明するエンティティとは意味が違うので要注意です)や、Java APIを使いやすくラップしたようなユーティリティクラスなどもインフラ層に該当します。\n
EffectiveJaveに書かれているノウハウで、DDDに直接関係ないですが、VOは基本Immutableなので、前提としておさえておきましょう。\nsetterがあってはなんにもならないのは当然。\nfinalフィールドは、誤ってsetter書いても、再代入をコンパイラで検出できます。\nフィールドをprivateにするのは、外部からのアクセスを禁止するためです。public final フィールドでもよいが、リリースした後に内部実装を変更できないのであまり推奨できないです。\n派生クラスでsetterの追加と、getterのオーバーライドによって不変性を破壊することを防ぐために、final classとしましょう。\nこれについては、実装クラスのみの場合は、Mockライブラリとの相性でfinalにできない場合があります。こういう場合はMockは使えないですね。まぁ、トレードオフだと思います。\n次の、可変オブジェクトの属性、つまりCollectionやMapなどのように同一インスタンスでどんどん状態を変更できるオブジェクトの属性ですね。その属性の参照を外部に渡した場合はもちろん状態を変更できます。これによって属性を保持しているオブジェクトの不変性が壊れてしまいます。これを防ぐにはcloneなどで防御的にコピーしたインスタンスを受渡します。コード上ではCloneUtilってのを使っています。あとで紹介します。\n