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.