Builderパターン(主にJava)の多くの実装を見てきました。それらはすべて、エンティティクラス(クラスとしましょうPerson
)とビルダークラスを持っていますPersonBuilder
。ビルダーはさまざまなフィールドを「スタック」し、new Person
渡された引数とともにを返します。Person
クラス自体にすべてのビルダーメソッドを配置するのではなく、明示的にビルダークラスが必要なのはなぜですか?
例えば:
class Person {
private String name;
private Integer age;
public Person() {
}
Person withName(String name) {
this.name = name;
return this;
}
Person withAge(int age) {
this.age = age;
return this;
}
}
簡単に言えます Person john = new Person().withName("John");
なぜPersonBuilder
クラスが必要なのですか?
私が見る唯一の利点は、Person
フィールドをとして宣言できることfinal
です。したがって、不変性が保証されます。
withName
。名前フィールドのみを変更した人物のコピーを返すことができます。言い換えれば、不変でPerson john = new Person().withName("John");
あってもPerson
機能します(これは関数型プログラミングの一般的なパターンです)。
void
メソッドを持たないようにしてください。したがって、たとえばPerson
、名前を出力するメソッドがある場合、Fluent Interfaceを使用してそれを連鎖させることができますperson.setName("Alice").sayName().setName("Bob").sayName()
。ところで、私はJavaDocのそれらに正確にあなたの提案で注釈を付けます@return Fluent interface
-それreturn this
は実行の最後に行うメソッドに適用するときに十分に一般的で明確であり、かなり明確です。そのため、ビルダーも流interfaceなインターフェイスを使用します。
chainable setters
:D