Bruker Lombok’s @Builder Annotation

1. Oversikt

Prosjekt Lombok @Bygger er en nyttig mekanisme for å bruke Builder-mønsteret uten å skrive kjeleplatekode. Vi kan bruke denne merknaden på en Klasse eller en metode.

I denne korte opplæringen vil vi se på de forskjellige brukssakene for @Bygger.

2. Maven-avhengigheter

Først må vi legge til Project Lombok i vårt pom.xml:

 org.projectlombok lombok 1.18.10 

Maven Central har den nyeste versjonen av Project Lombok her.

3. Bruke @Bygger på en klasse

I den første brukssaken implementerer vi bare en Klasse, og vi vil bruke en byggherre til å lage forekomster av klassen vår.

Det første og eneste trinnet er å legge til merknaden i klassedeklarasjonen:

@Getter @Builder public class Widget {private final Strengnavn; privat avsluttende int id; } 

Lombok gjør alt arbeidet for oss. Vi kan nå bygge en Widget og test det:

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

Hvis vi vil lage kopier eller nesten-kopier av objekter, kan vi legge til eiendommen toBuilder = sant til @Bygger kommentar:

@Builder (toBuilder = true) widget for offentlig klasse {// ...}

Dette forteller Lombok å legge til et toBuilder () metode til vår Klasse. Når vi påkaller toBuilder () metoden, den returnerer en byggherre initialisert med egenskapene til forekomsten den kalles på:

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);

Vi kan se i testkoden at byggeklassen generert av Lombok heter som klassen vår, med "Bygger" vedlagt den - WidgetBuilder i dette tilfellet. Vi kan deretter endre egenskapene vi ønsker og bygge() en ny forekomst.

Hvis vi trenger å spesifisere de påkrevde feltene, kan vi bruke merknadskonfigurasjonen til å opprette en hjelpebygger:

@Builder (builderMethodName = "internalBuilder") offentlig klasse RequiredFieldAnnotation {@NonNull private Strengnavn; privat strengbeskrivelse; offentlig statisk RequiredFieldAnnotationBuilder builder (String name) {return internalBuilder (). name (name); }}

I dette tilfellet skjuler vi standardverdien bygger som internalBuilder og skape våre egne. Derfor, når vi oppretter byggherren, må vi oppgi den nødvendige parameteren:

RequiredField.builder ("NameField"). Beskrivelse ("Field Description"). Build ();

For å sikre at feltet vårt eksisterer, kan vi også legge til @NonNull kommentar.

4. Bruke @Bygger på en metode

Anta at vi bruker et objekt som vi vil konstruere med en byggmester, men vi kan ikke endre kilden eller utvide Klasse.

Først, la oss lage et raskt eksempel ved å bruke Lomboks @Value-kommentar:

@Value final class ImmutableClient {private int id; privat strengnavn; }

Nå har vi en endeligKlasse med to uforanderlige medlemmer, getters for dem, og en all-argument konstruktør.

Vi dekket hvordan du bruker @Bygger på en Klasse, men vi kan også bruke den på metoder. Vi bruker denne evnen til å omgå ikke å kunne endre eller utvide Uforanderlig klient.

Deretter oppretter vi en ny klasse med en metode for å lage ImmutableClients:

klasse ClientBuilder {@Builder (builderMethodName = "builder") offentlig statisk ImmutableClient newClient (int id, String name) {return new ImmutableClient (id, name); }}

Denne kommentaren oppretter en metode som heter bygger() at returnerer a Bygger for å skape Uforanderlige klienter.

La oss nå bygge en Uforanderlig klient:

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

5. Konklusjon

I denne artikkelen brukte vi Lomboks @Bygger kommentar om en metode for å lage en byggherre for en endeligKlasse, og vi så hvordan vi skulle lage noe av Klasse felt påkrevd.

Kodeeksempler, som alltid, kan du finne på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found