A Builder minta automatikus létrehozása a FreeBuilder alkalmazással

1. Áttekintés

Ebben az oktatóanyagban a FreeBuilder könyvtár segítségével készítünk készítő osztályokat a Java-ban.

2. Építő tervezési minta

A Builder az egyik legelterjedtebb objektum-orientált nyelvű Creation Design Pattern. Azt absztrakt egy összetett tartományi objektum példányosítását és folyékony API-t biztosít példány létrehozásához. Ez elősegíti a tömör tartományréteg fenntartását.

Hasznossága ellenére az építtetőt általában bonyolult megvalósítani, különösen a Java-ban. Még egyszerűbb értékű objektumok is sok kazánlap kódot igényelnek.

3. Builder implementáció Java-ban

Mielőtt a FreeBuilderrel folytatnánk, valósítsunk meg egy kazánlemez készítőt a sajátunk számára Munkavállaló osztály:

public class Alkalmazott {private final String név; magán végső int kor; zártkörű vonós osztály; magán alkalmazott (karakterlánc neve, int kor, karakterlánc osztály) {this.név = név; ez.kor = életkor; ez.osztály = osztály; }}

És egy belső Építész osztály:

public static class Builder {private String name; privát int kor; saját vonós osztály; public Builder setName (karakterlánc neve) {this.name = név; adja vissza ezt; } public Builder setAge (int age) {this.age = age; adja vissza ezt; } public Builder setDepartment (String osztály) {this.department = részleg; adja vissza ezt; } public Employee build () {return new Employee (név, életkor, osztály); }}

Ennek megfelelően most már használhatjuk az építőt a Munkavállaló tárgy:

Employee.Builder emplBuilder = new Employee.Builder (); Munkavállalói alkalmazott = emplBuilder .setName ("baeldung") .setAge (12) .setDepartment ("Builder Pattern") .build ();

A fentiek szerint sok kazánlap kód szükséges egy építő osztály megvalósításához.

A későbbi szakaszokban meglátjuk, hogyan tudja a FreeBuilder azonnal egyszerűsíteni ezt a megvalósítást.

4. Maven-függőség

A FreeBuilder könyvtár hozzáadásához hozzáadjuk a FreeBuilder Maven függőséget pom.xml:

 org.követelt szabadépítő 2.4.1 

5. FreeBuilder Megjegyzés

5.1. Építő létrehozása

A FreeBuilder egy nyílt forráskódú könyvtár, amely segít a fejlesztőknek elkerülni a kazánlap kódot az építő osztályok megvalósítása közben. A Java-ban az annotáció-feldolgozást használja az építőminta konkrét megvalósításának előállításához.

Jól jegyezd fel a mi Munkavállaló osztály a korábbi szakaszból a @FreeBuilderés nézze meg, hogyan generálja automatikusan az építő osztályt:

@FreeBuilder nyilvános felület Alkalmazott {String név (); int kor (); Vonós részleg (); A Class Builder kiterjeszti az Employee_Builder alkalmazást {}}

Fontos rámutatni erre Munkavállaló most egy felületnem pedig POJO osztály. Ezenkívül tartalmazza az an Munkavállaló objektum mint módszerek.

Mielőtt tovább használnánk ezt a készítőt, konfigurálnunk kell az IDE-ket az összeállítási problémák elkerülése érdekében. Mivel FreeBuilder automatikusan generálja a Employee_Builder osztály az összeállítás során, az IDE általában panaszkodik ClassNotFoundException a 8. számú vonalon.

Az ilyen kérdések elkerülése érdekében engedélyeznünk kell a kommentárok feldolgozását az IntelliJ vagy az Eclipse programban. Ennek során a FreeBuilder kommentár-processzorát fogjuk használni org.inferred.freebuilder.processor.Processor. Ezenkívül a forrásfájlok létrehozásához használt könyvtárat meg kell jelölni a Generált források gyökérként.

Alternatív megoldásként kivégezhetjük is mvn install a projekt felépítéséhez és a szükséges építőosztályok előállításához.

Végül összeállítottuk a projektünket, és most már használhatjuk a Employee.Builder osztály:

Employee.Builder builder = new Employee.Builder (); Munkavállalói alkalmazott = építő.név ("baeldung") .age (10) .department ("Építőminta") .build ();

Összességében két fő különbség van ennek és az építő osztálynak, amelyet korábban láttunk. Első, meg kell adnunk az értéket a Munkavállaló osztály. Különben dob egy IllegalStateException.

Egy későbbi szakaszban megnézzük, hogyan kezeli a FreeBuilder az opcionális attribútumokat.

Másodszor, a Employee.Builder ne kövesse a JavaBean elnevezési szokásokat. Ezt a következő szakaszban láthatjuk.

5.2. JavaBean elnevezési egyezmény

A FreeBuilder kényszerítésére, hogy kövesse a JavaBean elnevezési megállapodást, meg kell tennünk átnevezzük a módszereinket a Munkavállaló és előtagozza a módszereket kap:

@FreeBuilder nyilvános felület Alkalmazott {String getName (); int getAge (); Karakterlánc getDepartment (); A Class Builder kiterjeszti az Employee_Builder alkalmazást {}}

Ez generál gettereket és beállítókat, amelyek követik a JavaBean elnevezési konvenciót:

Alkalmazott alkalmazott = builder .setName ("baeldung") .setAge (10) .setDepartment ("Builder Pattern") .build ();

5.3. Mapper módszerek

A FreeBuilder getterekkel és beállítókkal párosítva a mapper módszereket is hozzáadja az építő osztályhoz. Ezek a leképező módszerek fogadjon be egy UnaryOperator-t bemenetként, ezáltal lehetővé téve a fejlesztők számára a komplex mezőértékek kiszámítását.

Tegyük fel, hogy a mi Munkavállaló osztály fizetési mezővel is rendelkezik:

@FreeBuilder nyilvános felület Alkalmazott {Opcionális getSalaryInUSD (); }

Tegyük fel, hogy át kell alakítanunk a bemenetként megadott fizetés pénznemét:

hosszú fizetésInEuros = INPUT_SALARY_EUROS; Employee.Builder builder = new Employee.Builder (); Munkavállalói alkalmazott = építő .setName ("baeldung") .setAge (10) .mapSalaryInUSD (sal -> fizetésInEuros * EUROS_TO_USD_RATIO) .build ();

A FreeBuilder ilyen leképező módszereket biztosít minden mező számára.

6. Alapértelmezett értékek és kényszer-ellenőrzések

6.1. Alapértelmezett értékek beállítása

A Employee.Builder Az eddig tárgyalt megvalósítás elvárja, hogy az ügyfél az összes mező értékét átadja. Ami azt illeti, nem sikerül az inicializálási folyamat egy IllegalStateException hiányzó mezők esetén.

Az ilyen hibák elkerülése érdekében vagy beállíthatunk alapértelmezett értékeket a mezők számára, vagy opcionálisá tehetjük őket.

Alapértelmezett értékeket állíthatunk be a Employee.Builder konstruktőr:

@FreeBuilder nyilvános felület Employee {// getter method class Builder kiterjeszti az Employee_Builder {public Builder () {setDepartment ("Builder Pattern"); }}}

Tehát egyszerűen beállítottuk az alapértelmezett értéket osztály a konstruktorban. Ez az érték mindenkire érvényes Munkavállaló tárgyakat.

6.2. Kényszerellenőrzések

Általában a mező értékeire vannak bizonyos korlátozásaink. Például egy érvényes e-mailnek tartalmaznia kell egy „@” betűt vagy egy életkorát Munkavállaló tartományon belül kell lennie.

Az ilyen korlátozások megkövetelik, hogy érvényesítsük a bemeneti értékeket. És A FreeBuilder lehetővé teszi számunkra, hogy ezeket az érvényesítéseket egyszerűen felülírjuk szetter mód:

@FreeBuilder nyilvános felület Employee {// getter method class Builder kiterjeszti Employee_Builder {@Orride public Builder setEmail (String email) {if (checkValidEmail (email)) return super.setEmail (email); különben dobjon új IllegalArgumentException-t ("Érvénytelen e-mail"); } private boolean checkValidEmail (String email) {return email.contains ("@"); }}}

7. Opcionális értékek

7.1. Használata Választható Mezők

Néhány objektum választható mezőket tartalmaz, amelyek értékei lehetnek üresek vagy nullák. A FreeBuilder lehetővé teszi számunkra, hogy az ilyen mezőket a Java segítségével definiáljuk Választható típus:

@FreeBuilder nyilvános felület Alkalmazott {String getName (); int getAge (); // egyéb getterek Opcionális getPermanent (); Opcionális getDateOfJoining (); A Class Builder kiterjeszti az Employee_Builder alkalmazást {}}

Most kihagyhatjuk a (z) értékének megadását Választható mezők:

Munkavállalói alkalmazott = builder.setName ("baeldung") .setAge (10) .setPermanent (true) .build ();

Nevezetesen, egyszerűen átadtuk a (z) értékét állandó mező helyett egy Választható. Mivel nem állítottunk be értéke csatlakozás dátuma mező lesz Opcionális. Üres () ami az alapértelmezett Választható mezők.

7.2. Használata @Nullable Mezők

Bár használ Választható kezelésére ajánlott nullas Java-ban a FreeBuilder lehetővé teszi minket használni @Nullable a visszafelé kompatibilitás érdekében:

@FreeBuilder nyilvános felület Alkalmazott {String getName (); int getAge (); // egyéb getter módszerek Opcionális getPermanent (); Opcionális getDateOfJoining (); @Nullable String getCurrentProject (); A Class Builder kiterjeszti az Employee_Builder alkalmazást {}}

A ... haszna Választható bizonyos esetekben nem tanácsos, ami a másik oka annak @Nullable az építő osztályok számára előnyös.

8. Gyűjtemények és térképek

A FreeBuilder különleges támogatást nyújt a gyűjteményekhez és térképekhez:

@FreeBuilder nyilvános felület Alkalmazott {String getName (); int getAge (); // egyéb getter metódusok list getAccessTokens (); GetAssetsSerialIdMapping () térkép; A Class Builder kiterjeszti az Employee_Builder alkalmazást {}}

A FreeBuilder hozzáteszi kényelmi módszerek az input elemek hozzáadásához a Builder osztály Gyűjteményébe:

Munkavállalói alkalmazott = builder.setName ("baeldung") .setAge (10) .addAccessTokens (1221819L) .addAccessTokens (1223441L, 134567L) .build ();

Itt van még a getAccessTokens () módszer az építő osztályban mely módosíthatatlan listát ad vissza. Hasonlóképpen a Térkép:

Alkalmazott alkalmazott = builder.setName ("baeldung") .setAge (10) .addAccessTokens (1221819L) .addAccessTokens (1223441L, 134567L) .putAssetsSerialIdMapping ("Laptop", 12345L) .build ();

A getter módszer a Térkép is egy módosíthatatlan térképet ad vissza az ügyfélkódhoz.

9. Beágyazott építők

A valós alkalmazásokhoz szükségünk lehet sok értékes objektumot fészkel be a domain entitásainkhoz. És mivel a beágyazott objektumoknak önmagukban is szükségük lehet építő implementációkra, a FreeBuilder lehetővé teszi a beágyazott építhető típusok használatát.

Tegyük fel például, hogy van egy beágyazott komplex típusunk Cím ban,-ben Munkavállaló osztály:

@FreeBuilder nyilvános felület Cím {String getCity (); class Builder kiterjeszti a Address_Builder {}}

Most a FreeBuilder generál szetter módszerek Cím. Építő bemenetként együtt Cím típus:

Address.Builder addressBuilder = új Address.Builder (); addressBuilder.setCity (CITY_NAME); Alkalmazott alkalmazott = builder.setName ("baeldung") .setAddress (addressBuilder) .build ();

Nevezetesen a FreeBuilder metódust is ad hozzá testreszabhatja a meglévő Cím objektum a Munkavállaló:

Munkavállaló alkalmazott = builder.setName ("baeldung") .setAddress (addressBuilder) .mutateAddress (a -> a.setPinCode (112200)) .build ();

Együtt FreeBuilder típusú FreeBuilder lehetővé teszi más építők, például protók fészkelését is.

10. Részleges objektum építése

Amint azt korábban megbeszéltük, a FreeBuilder egy IllegalStateException bármilyen kényszer-megsértés esetén - például hiányoznak a kötelező mezők értékei.

Bár ez az termelési környezetek számára kívánatos, bonyolítja egység tesztelése, amely független általában a megszorításoktól.

Az ilyen kényszerek enyhítése érdekében a FreeBuilder lehetővé teszi számunkra, hogy részleges objektumokat építsünk:

Munkavállalói alkalmazott = builder.setName ("baeldung") .setAge (10) .setEmail ("[email protected]") .buildPartial (); assertNotNull (alkalmazott.getEmail ());

Tehát annak ellenére, hogy nem állítottuk be az összes kötelező mezőt a Munkavállaló, még mindig ellenőrizhetnénk, hogy a email mező értéke érvényes.

11. Egyedi toString () Módszer

Értékes objektumokkal, gyakran hozzá kell adnunk egy szokást toString () végrehajtás. A FreeBuilder ezt lehetővé teszi absztrakt osztályok:

@FreeBuilder public abstract class Alkalmazott {abstract String getName (); absztrakt int getAge (); @Orride public String toString () {return getName () + "(" + getAge () + "éves)"; } public static class Builder kiterjeszti az Employee_Builder-t {}}

Kijelentettük Munkavállaló mint absztrakt osztály, nem pedig interfész, és egy szokást adott toString () végrehajtás.

12. Összehasonlítás más építő könyvtárakkal

Az ebben a cikkben tárgyalt készítő megvalósítás nagyon hasonló a Lombok, az Immutables vagy bármely más annotációs processzoréhoz. Azonban, van néhány megkülönböztető jellemző hogy már megbeszéltük:

    • Mapper módszerek
    • Beágyazott építhető típusok
    • Részleges objektumok

13. Következtetés

Ebben a cikkben a FreeBuilder könyvtár segítségével építő osztályt készítettünk Java-ban. Építőosztály különféle testreszabásait kommentárok segítségével valósítottuk meg, ezzel csökkentve a megvalósításához szükséges kazán kódot.

Láttuk azt is, hogy a FreeBuilder miben különbözik a többi könyvtártól, és röviden átbeszéltük néhány jellemzőjüket ebben a cikkben.

Az összes kódpélda elérhető a GitHubon.


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