Lombok Builder s predvolenou hodnotou

1. Úvod

V tomto rýchlom výučbe preskúmame, ako môžeme poskytnúť predvolené hodnoty atribútov pri použití vzoru tvorcu Lombok.

Nezabudnite si pozrieť aj naše úvodné slovo na Lombok.

2. Závislosti

V tomto tutoriále použijeme Lombok a na to potrebujeme iba jednu závislosť:

 org.projectlombok lombok 1.18.10 za predpokladu 

3. POJO pomocou programu Lombok Builder

Najprv sa pozrime na to, ako nám Lombok môže pomôcť zbaviť sa štandardného kódu potrebného na implementáciu vzoru staviteľa.

Začneme jednoduchým POJO:

verejná trieda Pojo {súkromné ​​meno reťazca; súkromný boolovský originál; }

Aby bola táto trieda užitočná, budeme potrebovať getrov. Napríklad, ak chceme použiť túto triedu s ORM, budeme pravdepodobne potrebovať predvolený konštruktor.

Okrem toho chceme staviteľ pre túto triedu. S Lombokom to všetko môžeme mať s niekoľkými jednoduchými anotáciami:

@Getter @Builder @NoArgsConstructor @AllArgsConstructor verejná trieda Pojo {súkromné ​​meno reťazca; súkromný boolovský originál; }

4. Definovanie očakávaní

Definujme si niektoré očakávania toho, čo chceme dosiahnuť vo forme jednotkových testov.

Prvou a základnou požiadavkou je prítomnosť predvolených hodnôt po zostavení objektu pomocou nástroja na tvorbu:

@Test public void givenBuilderWithDefaultValue_ThanDefaultValueIsPresent () {Pojo build = Pojo.builder () .build (); Assert.assertEquals ("foo", build.getName ()); Assert.assertTrue (build.isOriginal ()); }

Tento test samozrejme zlyhá, pretože @Builder anotácia nevyplní hodnoty. Čoskoro to napravíme.

Ak použijeme ORM, zvyčajne sa spolieha na predvolený konštruktor. Od predvoleného konštruktora by sme teda mali očakávať rovnaké správanie ako od staviteľa:

@ Test public void givenBuilderWithDefaultValue_NoArgsWorksAlso () {Pojo build = Pojo.builder () .build (); Pojo pojo = nové Pojo (); Assert.assertEquals (build.getName (), pojo.getName ()); Assert.assertTrue (build.isOriginal () == pojo.isOriginal ()); }

V tejto fáze táto skúška vyhovuje.

Teraz sa pozrime, ako môžeme obom testom vyhovieť!

5. Lombok Builder. Predvolené Anotácia

Od verzie Lombok v1.16.16 môžeme používať @BuilderVnútorná anotácia:

// anotácie triedy ako pred verejnou triedou Pojo {@ Builder.Default private Názov reťazca = "foo"; @ Builder.Default private boolean original = true; }

Je to jednoduché a čitateľné, ale má to nejaké nedostatky.

Vďaka tomu budú predvolené hodnoty prítomné v nástroji na tvorbu, čo umožní splnenie prvého testovacieho prípadu. Konštruktor no-args bohužiaľ nezíska predvolené hodnoty, čím zlyhá druhý testovací prípad. Aj keď konštruktor bez argov nie je generovaný, ale je výslovne napísaný.

Tento vedľajší účinok Builder. Predvolené anotácia je prítomná od začiatku a pravdepodobne tu bude dlho.

6. Inicializujte Builder

Môžeme sa pokúsiť splniť obidva testy definovaním predvolených hodnôt v minimalistickej implementácii nástroja Builder:

// anotácie triedy ako pred verejnou triedou Pojo {private String name = "foo"; private boolean original = true; verejná statická trieda PojoBuilder {private Názov reťazca = "foo"; private boolean original = true; }}

Takto vyhovejú oba testy.

Cena je bohužiaľ duplikácia kódu. Pre POJO s desiatkami polí môže byť náchylné na chyby, aby sa zachovala dvojitá inicializácia.

Ak sme však ochotní zaplatiť túto cenu, mali by sme sa postarať aj o ďalšiu vec. Ak našu triedu premenujeme pomocou refaktoringu v rámci nášho IDE, statická vnútorná trieda nebude automaticky premenovaná. Potom ho Lombok nenájde a náš kód sa pokazí.

Aby sme eliminovali toto riziko, môžeme ozdobiť anotáciu staviteľa:

// anotácie triedy ako predtým @Builder (builderClassName = "PojoBuilder") verejná trieda Pojo {private Názov reťazca = "foo"; private boolean original = true; verejná statická trieda PojoBuilder {private Názov reťazca = "foo"; private boolean original = true; }}

7. Používanie toBuilder

@Builder podporuje tiež generovanie inštancie nástroja Builder z inštancie pôvodnej triedy. Táto funkcia nie je v predvolenom nastavení povolená. Môžeme to povoliť nastavením toBuilder parameter v anotácii staviteľa:

// anotácie triedy ako predtým @Builder (toBuilder = true) verejná trieda Pojo {private Názov reťazca = "foo"; private boolean original = true; }

S tým, môžeme sa zbaviť dvojitej inicializácie.

Samozrejme, má to svoju cenu. Musíme vytvoriť inštanciu triedy, aby sme vytvorili zostavovateľ. Musíme teda upraviť aj naše testy:

@Test public void givenBuilderWithDefaultValue_ThenDefaultValueIsPresent () {Pojo build = nový Pojo (). ToBuilder () .build (); Assert.assertEquals ("foo", build.getName ()); Assert.assertTrue (build.isOriginal ()); } @Test public void givenBuilderWithDefaultValue_thenNoArgsWorksAlso () {Pojo build = nový Pojo (). ToBuilder () .build (); Pojo pojo = nové Pojo (); Assert.assertEquals (build.getName (), pojo.getName ()); Assert.assertTrue (build.isOriginal () == pojo.isOriginal ()); }

Oba testy opäť vyhovujú, takže pomocou konštruktora bez argov máme rovnakú predvolenú hodnotu ako pri použití staviteľa.

8. Záver

Pozreli sme sa teda na niekoľko možností, ako poskytnúť predvolené hodnoty pre staviteľ Lombok.

Vedľajší účinok Staviteľ.Predvolené stojí za to sledovať anotáciu. Ostatné možnosti však majú tiež svoje nevýhody. Musíme si teda starostlivo vyberať na základe súčasnej situácie.

Ako vždy, kód je k dispozícii na GitHub.


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