2017-11-17 21 views
2

Ich bin ziemlich neu in Java. Könnte mir jemand die Vorteile der Verwendung von lombok@Builder zum Erstellen eines Objekts anstelle von Konstruktoraufruf erklären?lombok @Builder vs Konstruktor

MyObject o1 = MyObject.builder() 
       .id(1) 
       .name("name") 
       .build(); 

MyObject o2 = new MyObject(1, "name") 

Ist es nur eine Frage der besseren Sichtbarkeit? Diese

+4

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

+2

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

+1

Sorgfältige Übergabe von halbinitialisierten Bauherren. Sie sind veränderbar. Ein wichtiger Grund, Lombok überhaupt zu benutzen, sind unveränderliche Objekte. – slim

Antwort

3

ist kein lombok Spezifikum ist dies ein builder pattern.

Stellen Sie sich eine Klasse mit 20 Parameter genannt, und 10 von ihnen sind optional. Sie könnten irgendwie viele Konstruktoren dazu bringen, sich um diese Logik zu kümmern, oder einen Konstruktor mit all diesen Argumenten erstellen und Nullen an einigen Stellen übergeben. Ist das Builder-Muster nicht einfach einfacher?

+0

Wo: Eine Klasse sollte eine einzige Verantwortung haben. Meistens geht das nicht mit 20 Parametern zusammen. Wenn etwas 20 Felder hat, möchten Sie vielleicht lieber zurücktreten und prüfen, ob Sie wirklich über eine Sache sprechen, oder etwas, das eher in mehrere kleinere Dinge aufgeteilt werden sollte. – GhostCat

3

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.

Verwandte Themen