Korištenje Lombokove @Builder Annotation

1. Pregled

Projekt Lombok's @Graditelj je koristan mehanizam za upotrebu uzoraka Builder bez pisanja uzorka koda. Ovu bilješku možemo primijeniti na a Razred ili metoda.

U ovom kratkom vodiču razmotrit ćemo različite primjere upotrebe za @Graditelj.

2. Ovisnosti Mavena

Prvo, moramo dodati Project Lombok u naš pom.xml:

 org.projectlombok lombok 1.18.10 

Maven Central ovdje ima najnoviju verziju projekta Lombok.

3. Korištenje @Graditelj na Razredu

U prvom slučaju korištenja, samo implementiramo Razred, a mi želimo koristiti graditelj za stvaranje primjeraka naše klase.

Prvi i jedini korak je dodavanje napomene u deklaraciju klase:

@Getter @Builder javna klasa Widget {privatni konačni naziv niza; privatni konačni int id; } 

Lombok obavlja sve poslove umjesto nas. Sada možemo napraviti a Widget i testirajte:

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

Ako želimo stvoriti kopije ili gotovo kopije objekata, možemo dodati svojstvo toBuilder = točno prema @Graditelj bilješka:

@Builder (toBuilder = true) widget javne klase {// ...}

Ovo govori Lomboku da doda a toBuilder () metoda do našeg Razred. Kada zazivamo toBuilder () metoda, to vraća graditelj inicijaliziran svojstvima instance na koju se poziva:

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

U testnom kodu možemo vidjeti da je graditeljska klasa koju je generirao Lombok nazvana poput naše klase, s "Graditelj" priloženo uz to - WidgetBuilder u ovom slučaju. Tada možemo mijenjati svojstva koja želimo i izgraditi() nova instanca.

Ako trebamo navesti potrebna polja, možemo upotrijebiti konfiguraciju bilješki za stvaranje pomoćnog graditelja:

@Builder (builderMethodName = "internalBuilder") javna klasa RequiredFieldAnnotation {@NonNull privatni naziv niza; opis privatnog niza; javni statički graditelj RequiredFieldAnnotationBuilder (naziv niza) {return internalBuilder (). name (name); }}

U ovom slučaju skrivamo zadano graditelj kao InternalBuilder i stvaranje vlastitog. Dakle, kada kreiramo graditelj, moramo navesti traženi parametar:

RequiredField.builder ("NameField"). Description ("Opis polja"). Build ();

Također, kako bismo bili sigurni da naše polje postoji, možemo dodati @NonNull bilješka.

4. Korištenje @Graditelj na Metodi

Pretpostavimo da koristimo objekt koji želimo konstruirati s graditeljem, ali mi ne može izmijeniti izvor ili proširiti Razred.

Prvo, stvorimo brzi primjer koristeći Lombokovu napomenu @Value:

@Value konačna klasa ImmutableClient {private int id; privatni naziv niza; }

Sada imamo konačniRazred s dva nepromjenjiva člana, gettere za njih i konstruktor svih argumenata.

Pokrili smo kako koristiti @Graditelj na a Razred, ali možemo ga koristiti i za metode. Koristit ćemo ovu sposobnost da zaobiđemo nemogućnost izmjene ili proširenja Nepromjenjivi klijent.

Zatim ćemo stvoriti novu klasu s metodom za stvaranje ImmutableClients:

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

Ova bilješka stvara metodu imenovanu graditelj() da vraća a Graditelj za stvaranje Nepromjenjivi klijenti.

Sada, hajde da napravimo Nepromjenjivi klijent:

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

5. Zaključak

U ovom smo članku koristili Lombokov @Graditelj napomena o metodi za stvaranje graditelja za konačniPredavanje, i vidjeli smo kako napraviti neke od Razred obavezna polja.

Uzorke koda, kao i uvijek, možete pronaći na GitHubu.


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