Používanie anotácie spoločnosti Lombok @Builder

1. Prehľad

Projekt Lombok @Builder je užitočný mechanizmus na použitie vzoru Builder bez nutnosti písania kódu štandardného štítku. Túto anotáciu môžeme použiť na a Trieda alebo metóda.

V tomto krátkom tutoriáli sa pozrieme na rôzne prípady použitia @Builder.

2. Maven závislosti

Najskôr musíme pridať Project Lombok do nášho pom.xml:

 org.projectlombok lombok 1.18.10 

Maven Central má najnovšiu verziu projektu Lombok.

3. Používanie @Builder v triede

V prvom prípade použitia iba implementujeme a Triedaa chceme použiť inštančný nástroj na vytváranie inštancií našej triedy.

Prvým a jediným krokom je pridanie anotácie k deklarácii triedy:

@Getter @Builder verejná trieda Widget {súkromné ​​konečné meno reťazca; súkromné ​​konečné ID; } 

Lombok robí všetku prácu za nás. Teraz môžeme postaviť Widget a otestujte to:

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

Ak chceme vytvárať kópie alebo blízke kópie objektov, môžeme pridať vlastnosť toBuilder = true do @Builder anotácia:

@Builder (toBuilder = true) Widget verejnej triedy {// ...}

Toto hovorí Lomboku, aby pridal a toBuilder () metóda k našej Trieda. Keď vyvoláme toBuilder () metóda vráti staviteľ inicializovaný vlastnosťami inštancie, na ktorú sa volá:

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

V testovacom kóde vidíme, že trieda staviteľov generovaná Lombokom je pomenovaná ako naša trieda, s „Staviteľ“ pripojený k tomu - WidgetBuilder v tomto prípade. Potom môžeme upraviť vlastnosti, ktoré si prajeme a build () nová inštancia.

Ak potrebujeme určiť povinné polia, môžeme pomocou konfigurácie anotácií vytvoriť pomocný nástroj na tvorbu:

@Builder (builderMethodName = "internalBuilder") verejná trieda RequiredFieldAnnotation {@NonNull súkromné ​​meno reťazca; popis súkromného reťazca; public static RequiredFieldAnnotationBuilder builder (názov reťazca) {return internalBuilder (). name (name); }}

V tomto prípade skrývame predvolené nastavenie staviteľ ako internalBuilder a vytváranie vlastných. Keď teda vytvárame stavač, musíme poskytnúť požadovaný parameter:

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

Aby sme sa uistili, že naše pole existuje, môžeme pridať znak @NonNull anotácia.

4. Používanie @Builder na metóde

Predpokladajme, že používame objekt, ktorý chceme skonštruovať pomocou staviteľa, ale my sk Nemôžem upraviť zdroj ani rozšíriť Trieda.

Najprv si vytvoríme rýchly príklad pomocou anotácie @Value od Lomboku:

@Value konečná trieda ImmutableClient {private int id; súkromné ​​meno reťazca; }

Teraz máme konečnéTrieda s dvoma nezmeniteľnými členmi, getrami pre nich a konštruktorom všetkých argumentov.

Pokryli sme, ako sa používa @Builder na a Trieda, ale môžeme ho použiť aj na metódy. Túto schopnosť využijeme na to, aby sme neboli schopní upravovať alebo rozširovať ImmutableClient.

Ďalej vytvoríme novú triedu s metódou vytvárania ImmutableClients:

trieda ClientBuilder {@Builder (builderMethodName = "staviteľ") verejná statická ImmutableClient newClient (int id, názov reťazca) {return new ImmutableClient (id, name); }}

Táto anotácia vytvára metódu s názvom staviteľ () že vracia a Staviteľ na tvorenie Nezmeniteľní klienti.

Poďme si postaviť ImmutableClient:

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

5. Záver

V tomto článku sme použili Lombok @Builder anotácia metódy vytvorenia nástroja na tvorbu a konečnéTrieda, a videli sme, ako vyrobiť niektoré z Trieda povinné polia.

Ukážky kódu, ako vždy, nájdete na GitHub.


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