Widziałem wiele implementacji wzorca Builder (głównie w Javie). Wszystkie mają klasę encji (powiedzmy Person
klasę) i klasę konstruktora PersonBuilder
. Konstruktor „układa” różne pola i zwraca new Person
argument z przekazanymi argumentami. Dlaczego jawnie potrzebujemy klasy konstruktora, zamiast umieszczać wszystkie metody konstruktora w Person
samej klasie?
Na przykład:
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;
}
}
Mogę po prostu powiedzieć Person john = new Person().withName("John");
Dlaczego potrzeba PersonBuilder
zajęć?
Jedyną korzyścią, jaką widzę, jest to, że możemy zadeklarować Person
pola jako final
, zapewniając w ten sposób niezmienność.
withName
zwrócić kopię Osoby ze zmienionym tylko polem nazwiska. Innymi słowy, Person john = new Person().withName("John");
może działać, nawet jeśli Person
jest niezmienny (i jest to powszechny wzorzec w programowaniu funkcjonalnym).
void
metod. Na przykład, jeśli Person
ma metodę, która wypisuje ich nazwę, nadal możesz połączyć ją w płynny interfejs person.setName("Alice").sayName().setName("Bob").sayName()
. Nawiasem mówiąc, adnotuję te w JavaDoc z dokładnie twoją sugestią @return Fluent interface
- jest to ogólne i wystarczająco jasne, gdy stosuje się do dowolnej metody, która robi to return this
pod koniec jej wykonywania i jest dość jasne. Konstruktor będzie więc również płynnie posługiwał się interfejsem.
chainable setters
: D