Ich habe viele Implementierungen des Builder-Musters gesehen (hauptsächlich in Java). Alle von ihnen haben eine Entity-Klasse (sagen wir eine Person
Klasse) und eine Builder-Klasse PersonBuilder
. Der Builder "stapelt" verschiedene Felder und gibt ein new Person
mit den übergebenen Argumenten zurück. Warum benötigen wir explizit eine Builder-Klasse, anstatt alle Builder-Methoden in der Person
Klasse selbst zu platzieren?
Beispielsweise:
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;
}
}
Ich kann es einfach sagen Person john = new Person().withName("John");
Warum braucht man eine PersonBuilder
Klasse?
Der einzige Vorteil, den ich sehe, ist, dass wir die Person
Felder als deklarieren können, um die final
Unveränderlichkeit zu gewährleisten.
withName
eine Kopie der Person zurücksenden, wobei nur das Namensfeld geändert wurde. Mit anderen Worten, Person john = new Person().withName("John");
könnte funktionieren, auch wenn Person
unveränderlich ist (und dies ist ein verbreitetes Muster in der funktionalen Programmierung).
void
Methoden. Wenn beispielsweise Person
eine Methode ihren Namen ausgibt, können Sie sie dennoch mit einer Fluent-Schnittstelle verketten person.setName("Alice").sayName().setName("Bob").sayName()
. Übrigens kommentiere ich die in JavaDoc mit genau Ihrem Vorschlag @return Fluent interface
- es ist allgemein und klar genug, wenn es auf eine Methode angewendet wird, die return this
am Ende ihrer Ausführung ausgeführt wird, und es ist ziemlich klar. Ein Builder wird also auch eine flüssige Benutzeroberfläche erstellen.
chainable setters
: D