Met behulp van de @Builder-annotatie van Lombok

1. Overzicht

Project Lombok's @Bouwer is een handig mechanisme om het Builder-patroon te gebruiken zonder standaardcode te schrijven. We kunnen deze annotatie toepassen op een Klasse of een methode.

In deze korte tutorial kijken we naar de verschillende gebruiksscenario's voor @Bouwer.

2. Maven afhankelijkheden

Eerst moeten we Project Lombok toevoegen aan ons pom.xml:

 org.projectlombok lombok 1.18.10 

Maven Central heeft hier de nieuwste versie van Project Lombok.

3. Met behulp van @Bouwer op een klas

In het eerste use-case implementeren we slechts een Klasse, en we willen een builder gebruiken om instanties van onze klasse te maken.

De eerste en enige stap is om de annotatie toe te voegen aan de klasseverklaring:

@Getter @Builder public class Widget {private final String naam; privé definitieve int id; } 

Lombok doet al het werk voor ons. We kunnen nu een Widget en test het:

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

Als we kopieën of bijna-kopieën van objecten willen maken, kunnen we de eigenschap toevoegen toBuilder = waar naar de @Bouwer annotatie:

@Builder (toBuilder = true) openbare klasse Widget {// ...}

Dit vertelt Lombok om een toBuilder () methode naar onze Klasse. Wanneer we het toBuilder () methode, het geeft een builder terug die is geïnitialiseerd met de eigenschappen van de instantie waarop deze wordt aangeroepen:

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

We kunnen in de testcode zien dat de builder-klasse die door Lombok wordt gegenereerd, dezelfde naam heeft als onze klasse, met "Bouwer" eraan toegevoegd - WidgetBuilder in dit geval. We kunnen dan de eigenschappen wijzigen die we willen en bouwen() een nieuw exemplaar.

Als we de vereiste velden moeten specificeren, kunnen we de annotatieconfiguratie gebruiken om een ​​hulpbouwer te maken:

@Builder (builderMethodName = "internalBuilder") openbare klasse RequiredFieldAnnotation {@NonNull private String-naam; private String beschrijving; openbare statische RequiredFieldAnnotationBuilder builder (String naam) {return internalBuilder (). naam (naam); }}

In dit geval verbergen we de standaardinstelling bouwer net zo internalBuilder en het creëren van onze eigen. Dus wanneer we de builder maken, moeten we de vereiste parameter opgeven:

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

Om er zeker van te zijn dat ons veld bestaat, kunnen we ook de @RTLnieuws annotatie.

4. Met behulp van @Bouwer op een methode

Stel dat we een object gebruiken dat we met een bouwer willen bouwen, maar wij kan de bron niet wijzigen of het Klasse.

Laten we eerst een snel voorbeeld maken met de @Value-annotatie van Lombok:

@Value laatste klasse ImmutableClient {privé int id; private String naam; }

Nu hebben we een laatsteKlasse met twee onveranderlijke leden, getters voor hen, en een constructor met alle argumenten.

We hebben besproken hoe te gebruiken @Bouwer op een Klasse, maar we kunnen het ook op methoden gebruiken. We zullen deze mogelijkheid gebruiken om te voorkomen dat we deze niet kunnen wijzigen of uitbreiden Onveranderlijke cliënt.

Vervolgens maken we een nieuwe klasse met een methode om ImmutableClients te maken:

class ClientBuilder {@Builder (builderMethodName = "builder") openbare statische ImmutableClient newClient (int id, String naam) {retourneer nieuwe ImmutableClient (id, naam); }}

Deze annotatie creëert een methode met de naam bouwer() dat geeft een terug Bouwer voor het maken Onveranderlijke klanten.

Laten we nu een Onveranderlijke cliënt:

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

5. Conclusie

In dit artikel hebben we Lombok's gebruikt @Bouwer annotatie op een methode om een ​​builder te maken voor een laatsteKlasse, en we hebben gezien hoe we een aantal van de Klasse velden verplicht.

Codevoorbeelden zijn, zoals altijd, te vinden op GitHub.