Lomboks @Builder-Annotation verwenden

Verwendung von Lomboks @Builder Annotation

1. Überblick

@Builder von Project Lombok ist ein nützlicher Mechanismus für die Verwendung vonBuilder pattern, ohne Boilerplate-Code zu schreiben. Wir können diese Annotation aufClass oder eine Methode anwenden.

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

2. Maven-Abhängigkeiten

Zuerst müssen wirProject Lombok zu unserenpom.xml hinzufügen:


    org.projectlombok
    lombok
    1.16.20.0

3. Verwenden von@Builder für eine Klasse

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

Der erste und einzige Schritt ist das Hinzufügen der Annotation zur Klassendeklaration:

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

Lombok does all of the work for us. Wir können jetzt einWidget erstellen und testen:

Widget testWidget = Widget.builder()
  .name("foo")
  .id(1)
  .build();

assertThat(testWidget.getName())
  .isEqualTo("foo");
assertThat(testWidget.getId())
  .isEqualTo(1);

If we want to create copies or near-copies of objects, we can add the property toBuilder = true to the @Builder annotation:

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

Dies weist Lombok an, einetoBuilder()-Methode zu unserenClass hinzuzufügen. Wenn wir die MethodetoBuilder() aufrufen, ist esreturns a builder initialized with the properties of the instance it is called on:

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 FallWidgetBuilder. Wir können dann die gewünschten Eigenschaften ändern undbuild()ist eine neue Instanz.

4. Verwenden von@Builder für eine Methode

Angenommen, wir verwenden ein Objekt, das wir mit einem Builder erstellen möchten, aber wircan’t modify the source or extend the*Class*.

Lassen Sie uns zunächst ein kurzes Beispiel mitLombok’s @Value annotation: erstellen

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

Jetzt haben wir einfinalClass mit zwei unveränderlichen Mitgliedern, Gettern für sie und einem Konstruktor für alle Argumente.

We covered how to use @Builder on a Class, but we can use it on methods, too. Mit dieser Funktion können Sie umgehen, dassImmutableClient nicht geändert oder erweitert werden können.

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 mit dem Namenbuilder(), diereturns a Builder for creating ImmutableClients.

Jetzt können wir einImmutableClient erstellen:

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

5. Fazit

In diesem Artikel haben wir die Annotation@Buildervon Lombok für eine Methode verwendet, um einen Builder fürfinalClass. zu erstellen

Codebeispiele finden sich wie immer inover on GitHub.