Verwenden der @ Builder-Anmerkung von Lombok

1. Übersicht

@Builder von Project Lombok ist ein nützlicher Mechanismus für die Verwendung des Builder-Musters, ohne Boilerplate-Code zu schreiben. Wir können diese Anmerkung auf eine Klasse oder eine Methode anwenden .

In diesem kurzen Tutorial werden die verschiedenen Anwendungsfälle für @Builder vorgestellt .

2. Maven-Abhängigkeiten

Zuerst müssen wir Project Lombok zu unserer pom.xml hinzufügen :

 org.projectlombok lombok 1.18.10 

Maven Central hat hier die neueste Version von Project Lombok.

3. Verwenden von @Builder für eine Klasse

Im ersten Anwendungsfall implementieren wir lediglich eine Klasse und möchten einen Builder verwenden, um Instanzen unserer Klasse zu erstellen.

Der erste und einzige Schritt besteht darin, die Anmerkung zur Klassendeklaration hinzuzufügen:

@Getter @Builder public class Widget { private final String name; private final int id; } 

Lombok erledigt die ganze Arbeit für uns. Wir können jetzt ein Widget erstellen und es testen:

Widget testWidget = Widget.builder() .name("foo") .id(1) .build(); assertThat(testWidget.getName()) .isEqualTo("foo"); assertThat(testWidget.getId()) .isEqualTo(1);

Wenn wir Kopien oder Beinahe-Kopien von Objekten erstellen möchten, können wir die Eigenschaft toBuilder = true zur Annotation @Builder hinzufügen :

@Builder(toBuilder = true) public class Widget { //... }

Dies weist Lombok an , unserer Klasse eine toBuilder () -Methode hinzuzufügen . Wenn wir die toBuilder () -Methode aufrufen , wird ein Builder zurückgegeben, der mit den Eigenschaften der Instanz initialisiert wurde, für die er aufgerufen wird:

Widget testWidget = Widget.builder() .name("foo") .id(1) .build(); Widget.WidgetBuilder widgetBuilder = testWidget.toBuilder(); Widget newWidget = widgetBuilder.id(2).build(); assertThat(newWidget.getName()) .isEqualTo("foo"); assertThat(newWidget.getId()) .isEqualTo(2);

Wir können im Testcode sehen, dass die von Lombok generierte Builder-Klasse wie unsere Klasse benannt ist, an die „Builder“ angehängt ist - in diesem Fall WidgetBuilder . Wir können dann die gewünschten Eigenschaften ändern und eine neue Instanz erstellen () .

Wenn wir die erforderlichen Felder angeben müssen, können wir die Anmerkungskonfiguration verwenden, um einen zusätzlichen Builder zu erstellen:

@Builder(builderMethodName = "internalBuilder") public class RequiredFieldAnnotation { @NonNull private String name; private String description; public static RequiredFieldAnnotationBuilder builder(String name) { return internalBuilder().name(name); } }

In diesem Fall verstecken wir den Standard- Builder als internalBuilder und erstellen unseren eigenen. Wenn wir den Builder erstellen, müssen wir daher den erforderlichen Parameter angeben:

RequiredField.builder("NameField").description("Field Description").build();

Um sicherzustellen, dass unser Feld vorhanden ist, können wir auch die Annotation @NonNull hinzufügen .

4. Verwenden von @Builder für eine Methode

Angenommen, wir verwenden ein Objekt, das wir mit einem Builder erstellen möchten, können jedoch weder die Quelle ändern noch die Klasse erweitern .

Lassen Sie uns zunächst ein kurzes Beispiel mit der @ Value-Annotation von Lombok erstellen:

@Value final class ImmutableClient { private int id; private String name; }

Jetzt haben wir eine letzte Klasse mit zwei unveränderlichen Mitgliedern, Getter für sie und einem Konstruktor mit allen Argumenten.

Wir haben erläutert , wie @Builder für eine Klasse verwendet wird , aber wir können es auch für Methoden verwenden. Wir werden diese Fähigkeit nutzen, um zu umgehen, dass ImmutableClient nicht geändert oder erweitert werden kann .

Als Nächstes erstellen wir eine neue Klasse mit einer Methode zum Erstellen von ImmutableClients:

class ClientBuilder { @Builder(builderMethodName = "builder") public static ImmutableClient newClient(int id, String name) { return new ImmutableClient(id, name); } }

Diese Annotation erstellt eine Methode namens builder () , die einen Builder zum Erstellen von ImmutableClients zurückgibt .

Erstellen wir nun einen ImmutableClient :

ImmutableClient testImmutableClient = ClientBuilder.builder() .name("foo") .id(1) .build(); assertThat(testImmutableClient.getName()) .isEqualTo("foo"); assertThat(testImmutableClient.getId()) .isEqualTo(1);

5. Schlussfolgerung

In diesem Artikel haben wir die @ Builder- Annotation von Lombok für eine Methode verwendet, um einen Builder für eine endgültige Klasse zu erstellen , und wir haben gesehen, wie einige der erforderlichen Klassenfelder erstellt werden.

Codebeispiele finden Sie wie immer auf GitHub.