Lombok Builder alapértelmezett értékkel

1. Bemutatkozás

Ebben a gyors bemutatóban megvizsgáljuk, hogyan adhatunk meg alapértelmezett értékeket az attribútumokhoz, ha az építőmintát használjuk Lombok.

Feltétlenül nézze meg a Lombok bevezetőjét is.

2. Függőségek

A Lombok alkalmazást ebben az oktatóanyagban fogjuk használni, és ehhez csak egy függőségre van szükségünk:

 org.projectlombok lombok 1.18.10 biztosított 

3. POJO a Lombok Builderrel

Először nézzük meg, hogyan segíthet a Lombok abban, hogy megszabaduljunk az építőminta megvalósításához szükséges kazánlap kódtól.

Kezdjük egy egyszerű POJO-val:

nyilvános osztály Pojo {privát karakterlánc neve; saját logikai eredeti; }

Ahhoz, hogy ez az óra hasznos legyen, szükségünk lesz getterekre. Ha például ezt az osztályt egy ORM-mel akarjuk használni, akkor valószínűleg szükségünk lesz egy alapértelmezett konstruktorra.

Ezeken felül szeretnénk egy építőt ehhez az osztályhoz. A Lombok segítségével mindezt néhány egyszerű megjegyzéssel megkaphatjuk:

@Getter @Builder @NoArgsConstructor @AllArgsConstructor public class Pojo {private String name; saját logikai eredeti; }

4. Az elvárások meghatározása

Definiáljunk néhány elvárást arra vonatkozóan, hogy mit szeretnénk elérni egységtesztek formájában.

Az első és az alapvető követelmény az alapértelmezett értékek megléte, miután egy objektumot építünk egy építővel:

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

Természetesen ez a teszt kudarcot vall, mivel a @Építész a kommentár nem tölti be az értékeket. Ezt hamarosan megoldjuk.

Ha ORM-et használunk, az általában egy alapértelmezett konstruktorra támaszkodik. Tehát ugyanazt a viselkedést kell elvárnunk az alapértelmezett konstruktortól, mint az építőtől:

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

Ebben a szakaszban ez a teszt sikeres.

Most nézzük meg, hogyan tudjuk mindkét tesztet sikeresen teljesíteni!

5. Lombokék Builder. Alapértelmezés Megjegyzés

A Lombok v1.16.16 óta használhatjuk @ÉpítészBelső megjegyzés:

// osztályjegyzetek, mint korábban, a nyilvános osztály Pojo {@ Builder.Default private String name = "foo"; @ Builder.Default private boolean original = true; }

Ez egyszerű és olvasható, de van néhány hibája.

Ezzel az alapértelmezett értékek jelen lesznek a készítőnél, így az első teszteset sikeres lesz. Sajnos a no-args konstruktor nem fogja megkapni az alapértelmezett értékeket, így a második teszteset kudarcot vall. Még akkor is, ha a no-args konstruktort nem generálják, hanem kifejezetten megírják.

Ez a mellékhatása a Builder. Alapértelmezés az annotáció a kezdetektől fogva jelen van, és valószínűleg sokáig velünk lesz.

6. Inicializálja az építőt

Megpróbálhatjuk mindkét tesztet sikeresen teljesíteni az alapértelmezett értékek definiálásával egy minimalista készítő megvalósításban:

// osztályjegyzetek, mint korábban, nyilvános osztály Pojo {private String name = "foo"; privát logikai eredeti = true; public static class PojoBuilder {private String name = "foo"; privát logikai eredeti = true; }}

Így mindkét teszt sikeres lesz.

Sajnos az ár kódmásolás. A POJO több tíz mezővel hibás lehet a kettős inicializálás fenntartása.

De ha hajlandóak vagyunk megfizetni ezt az árat, akkor még egy dologról is gondoskodnunk kell. Ha átnevezzük osztályunkat az IDE-n belüli refaktor használatával, akkor a statikus belső osztályt nem nevezik automatikusan át. Akkor Lombok nem fogja megtalálni, és a kódunk meg fog törni.

Ennek a kockázatnak a kiküszöbölése érdekében díszíthetjük a készítő jelölését:

// osztályjegyzetek, mint korábban @Builder (builderClassName = "PojoBuilder") public class Pojo {private String name = "foo"; privát logikai eredeti = true; public static class PojoBuilder {private String name = "foo"; privát logikai eredeti = true; }}

7. Használata toBuilder

@Építész támogatja az építő egy példányának előállítását az eredeti osztály példányából. Ez a szolgáltatás alapértelmezés szerint nincs engedélyezve. A. Beállításával engedélyezhetjük toBuilder paraméter a készítő kommentárjában:

// osztályjegyzetek, mint korábban @Builder (toBuilder = true) public class Pojo {private String name = "foo"; privát logikai eredeti = true; }

Ezzel, megszabadulhatunk a kettős inicializálástól.

Ennek természetesen ára van. Instantálnunk kell az osztályt, hogy létrehozzunk egy építőt. Tehát módosítanunk kell a tesztjeinket is:

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

Ismét mindkét teszt sikeres, tehát ugyanaz az alapértelmezett értékünk van a no-args konstruktor használatával, mint az építő használatakor.

8. Következtetés

Tehát több lehetőséget is megvizsgáltunk az alapértelmezett értékek megadásához a Lombok készítőhöz.

A mellékhatása a Építész.Alapértelmezett az annotációra érdemes figyelni. De a többi lehetőségnek is van hátránya. Tehát gondosan kell választanunk a jelenlegi helyzet alapján.

Mint mindig, a kód elérhető a GitHubon.