Bedenken Sie:
Order order = new Order("Alan", "Smith", 2, 6, "Susan", "Smith");
Was bedeuten die Parameter? Wir müssen uns die Konstruktor-Spezifikation anschauen, um das herauszufinden.
Jetzt mit einem Erbauer:
Order order = Order.builder()
.originatorFirstName("Alan")
.originatorLastName("Smith")
.lineItemNumber(2)
.quantity(6)
.recipientFirstName("Susan")
.recipientLastName("Smith")
.build();
Es ist mehr wortreich, aber es ist ganz klar zu lesen, und mit IDE-Unterstützung ist es einfach zu schreiben. Die Builder selbst sind ein bisschen mühsam zu schreiben, aber Tools zur Code-Generierung wie Lombok helfen dabei.
Einige Leute argumentieren, dass, wenn Ihr Code Builder benötigt, um lesbar zu sein, das andere Gerüche freilegt. Du verwendest zu viele Grundtypen; Du setzt zu viele Felder in eine Klasse. Betrachten wir zum Beispiel:
Order order = new Order(
new Originator("Alan", "Smith"),
new ItemSet(new Item(2), 6),
new Recipient("Susan", "Smith"));
..., die ohne Verwendung eines Builder selbsterklärend ist, weil wir mehr Klassen mit Einzelaufgaben und weniger Felder verwenden.
nicht "Sichtbarkeit", sondern "Lesbarkeit". Und Sie können * theoretisch * mehr Dinge mit einem Builder tun, da Sie den halb initialisierten Builder übergeben können. – luk2302
Der Builder hat jedoch einen Nachteil: Sie müssen nicht alle obligatorischen Parameter angeben. Wenn Sie zum Beispiel einen Code umformatieren und dem Konstruktor einen obligatorischen Parameter hinzufügen, haben Sie keinen Compilerfehler bei Builder-Aufrufern ... aber Sie haben Laufzeitfehler. – Joel
Sorgfältige Übergabe von halbinitialisierten Bauherren. Sie sind veränderbar. Ein wichtiger Grund, Lombok überhaupt zu benutzen, sind unveränderliche Objekte. – slim