Automatické generovanie modelu staviteľa pomocou FreeBuilder

1. Prehľad

V tomto tutoriále použijeme knižnicu FreeBuilder na generovanie tried zostavovateľa v Jave.

2. Návrhový vzor staviteľa

Builder je jedným z najbežnejšie používaných vzorov vytvárania návrhov v objektovo orientovaných jazykoch. To abstrahuje inštanciu komplexného doménového objektu a poskytuje plynulé rozhranie API na vytvorenie inštancie. Pomáha tak udržiavať stručnú doménovú vrstvu.

Napriek svojej užitočnosti je builder implementácia všeobecne zložitá, najmä v Jave. Aj objekty s jednoduchšou hodnotou vyžadujú veľa štandardného kódu.

3. Implementácia staviteľa v Jave

Predtým, ako začneme s FreeBuilderom, poďme implementovať štandardný program na tvorbu štítkov pre naše Zamestnanec trieda:

public class Employee {private final String name; konečný súkromný vek; súkromné ​​záverečné reťazcové oddelenie; private Employee (String name, int age, String department) {this.name = name; this.age = vek; this.department = department; }}

A vnútornú Staviteľ trieda:

public static class Builder {private String name; súkromný int vek; súkromné ​​strunové oddelenie; public Builder setName (názov reťazca) {this.name = meno; vráťte to; } public Builder setAge (int vek) {this.age = vek; vráťte to; } public Builder setDepartment (reťazcové oddelenie) {this.department = department; vráťte to; } public Employee build () {návrat nového zamestnanca (meno, vek, oddelenie); }}

V súlade s tým môžeme teraz použiť nástroj na vytváranie inštancií Zamestnanec objekt:

Employee.Builder emplBuilder = nový Employee.Builder (); Employee employee = emplBuilder .setName ("baeldung") .setAge (12) .setDepartment ("Builder Pattern") .build ();

Ako je uvedené vyššie, veľa implementačného kódu je potrebných na implementáciu triedy staviteľov.

V ďalších častiach uvidíme, ako môže FreeBuilder okamžite zjednodušiť túto implementáciu.

4. Maven závislosť

Ak chcete pridať knižnicu FreeBuilder, do našej skupiny pridáme závislosť FreeBuilder Maven pom.xml:

 org. odvodený freebuilder 2.4.1 

5. FreeBuilder Anotácia

5.1. Generuje sa Builder

FreeBuilder je knižnica typu open-source, ktorá pomáha vývojárom vyhnúť sa štandardnému kódu pri implementácii tried staviteľa. Využíva spracovanie anotácií v Jave na vygenerovanie konkrétnej implementácie vzoru staviteľa.

Budeme anotovať naše Zamestnanec triedy zo staršej časti s @FreeBuildera uvidíte, ako automaticky generuje triedu staviteľov:

@FreeBuilder verejné rozhranie Employee {String name (); int vek (); Sláčikové oddelenie (); class Builder rozširuje Employee_Builder {}}

Je dôležité na to poukázať Zamestnanec je teraz rozhranieskôr ako trieda POJO. Ďalej obsahuje všetky atribúty súboru Zamestnanec objekt ako metódy.

Predtým, ako budeme ďalej používať tento zostavovač, musíme nakonfigurovať naše IDE, aby sme sa vyhli problémom s kompiláciou. Odkedy FreeBuilder automaticky generuje Employee_Builder triedy počas kompilácie, IDE zvyčajne sa sťažuje ClassNotFoundException na linke číslo 8.

Aby sa zabránilo takýmto problémom, musíme povoliť spracovanie anotácií v IntelliJ alebo Eclipse. A pritom použijeme anotačný procesor FreeBuilder org.inference.freebuilder.processor.Procesor. Adresár použitý na generovanie týchto zdrojových súborov by mal byť navyše označený ako Root generovaných zdrojov.

Prípadne môžeme aj vykonať inštalácia mvn na zostavenie projektu a vygenerovanie požadovaných tried staviteľa.

Nakoniec sme zostavili náš projekt a teraz môžeme používať Zamestnanec. Staviteľ trieda:

Employee.Builder builder = nový Employee.Builder (); Zamestnanec zamestnanec = builder.name ("baeldung") .age (10) .department ("Builder Pattern") .build ();

Celkovo existujú dva hlavné rozdiely medzi touto a triedou staviteľov, ktorú sme videli skôr. Najprv, musíme nastaviť hodnotu pre všetky atribúty Zamestnanec trieda. Inak to hodí IllegalStateException.

Uvidíme, ako FreeBuilder spracuje voliteľné atribúty v ďalšej časti.

Po druhé, názvy metód Zamestnanec. Staviteľ nedodržiavajte konvencie pomenovania JavaBean. Uvidíme v ďalšej časti.

5.2. Dohovor o pomenovaní JavaBean

Aby sme vynútili, aby FreeBuilder dodržiaval konvenciu pomenovania JavaBean, musíme premenovať naše metódy v Zamestnanec a predponu metód s dostať:

@FreeBuilder verejné rozhranie Employee {String getName (); int getAge (); Reťazec getDepartment (); class Builder rozširuje Employee_Builder {}}

Toto vygeneruje getry a settery, ktoré sa riadia konvenciou pomenovania JavaBean:

Zamestnanec zamestnanec = staviteľ .setName ("baeldung") .setAge (10) .setDepartment ("vzor staviteľa") .build ();

5.3. Mapovacie metódy

Spolu s getrami a settermi pridáva FreeBuilder do triedy staviteľov aj mapovacie metódy. Tieto mapovacie metódy prijať UnaryOperator ako vstup, čím vývojárom umožňuje vypočítať zložité hodnoty poľa.

Predpokladajme, že náš Zamestnanec trieda má tiež platové pole:

@FreeBuilder verejné rozhranie Employee {Optional getSalaryInUSD (); }

Teraz predpokladajme, že musíme previesť menu platu, ktorý sa poskytuje ako vstup:

dlhý platInEuros = INPUT_SALARY_EUROS; Employee.Builder builder = nový Employee.Builder (); Zamestnanec zamestnanec = staviteľ .setName ("baeldung") .setAge (10) .mapSalaryInUSD (sal -> platInEuros * EUROS_TO_USD_RATIO) .build ();

FreeBuilder poskytuje také mapovacie metódy pre všetky polia.

6. Predvolené hodnoty a kontroly obmedzení

6.1. Nastavenie predvolených hodnôt

The Zamestnanec. Staviteľ implementácia, o ktorej sme doteraz hovorili, očakáva, že klient odovzdá hodnoty pre všetky polia. V skutočnosti zlyhá proces inicializácie pomocou IllegalStateException v prípade chýbajúcich polí.

Aby sa zabránilo takýmto zlyhaniam, môžeme buď nastaviť predvolené hodnoty pre polia, alebo ich zmeniť na voliteľné.

Predvolené hodnoty môžeme nastaviť v Zamestnanec. Staviteľ konštruktér:

@FreeBuilder verejné rozhranie Employee {// getter methods class Builder extends Employee_Builder {public Builder () {setDepartment ("Builder Pattern"); }}}

Takže sme jednoducho nastavili predvolené nastavenie oddelenie v konštruktore. Táto hodnota bude platiť pre všetkých Zamestnanec predmety.

6.2. Kontroly obmedzenia

Zvyčajne máme určité obmedzenia týkajúce sa hodnôt poľa. Platný e-mail musí napríklad obsahovať znak „@“ alebo vek Zamestnanec musí byť v rozsahu.

Takéto obmedzenia si vyžadujú, aby sme na vstupné hodnoty zadali validácie. A FreeBuilder nám umožňuje pridať tieto validácie iba prepísaním stavač metódy:

@FreeBuilder verejné rozhranie Employee {// getter methods class Builder extends Employee_Builder {@Override public Builder setEmail (String email) {if (checkValidEmail (email)) return super.setEmail (email); else throw new IllegalArgumentException ("Neplatný e-mail"); } private boolean checkValidEmail (reťazcový e-mail) {návrat email.contains ("@"); }}}

7. Nepovinné hodnoty

7.1. Použitím Voliteľné Polia

Niektoré objekty obsahujú voliteľné polia, ktorých hodnoty môžu byť prázdne alebo nulové. FreeBuilder nám umožňuje definovať takéto polia pomocou Javy Voliteľné typu:

@FreeBuilder verejné rozhranie Employee {String getName (); int getAge (); // ďalšie getre Voliteľné getPermanent (); Voliteľné getDateOfJoining (); class Builder rozširuje Employee_Builder {}}

Teraz môžeme preskočiť poskytnutie akejkoľvek hodnoty pre Voliteľné polia:

Zamestnanec zamestnanec = builder.setName ("baeldung") .setAge (10) .setPermanent (true) .build ();

Je pozoruhodné, že sme jednoducho odovzdali hodnotu pre trvalé pole namiesto Voliteľné. Keďže sme nenastavili hodnota pre dateOfJoining pole, bude Optional.empty () čo je predvolené pre Voliteľné polia.

7.2. Použitím @ Nullable Polia

Aj keď pomocou Voliteľné sa odporúča na manipuláciu nulovýs v jazyku Java, umožňuje FreeBuilder nás použiť @ Nullable kvôli spätnej kompatibilite:

@FreeBuilder verejné rozhranie Employee {String getName (); int getAge (); // ďalšie metódy getra Voliteľné getPermanent (); Voliteľné getDateOfJoining (); @ Nullable String getCurrentProject (); class Builder rozširuje Employee_Builder {}}

Použitie Voliteľné v niektorých prípadoch nie je poučený, a to je ďalší dôvod, prečo @ Nullable je preferovaný pre triedy staviteľov.

8. Zbierky a mapy

FreeBuilder má špeciálnu podporu pre zbierky a mapy:

@FreeBuilder verejné rozhranie Employee {String getName (); int getAge (); // ďalšie getrové metódy List getAccessTokens (); Mapa getAssetsSerialIdMapping (); class Builder rozširuje Employee_Builder {}}

FreeBuilder dodáva pohodlné metódy na pridanie vstupných prvkov do kolekcie v triede staviteľa:

Zamestnanec zamestnanec = builder.setName ("baeldung") .setAge (10) .addAccessTokens (1221819L) .addAccessTokens (1223441L, 134567L) .build ();

K dispozícii je tiež getAccessTokens () metóda v triede staviteľov, ktorá vráti neupraviteľný zoznam. Podobne pre Mapa:

Zamestnanec zamestnanec = builder.setName ("baeldung") .setAge (10) .addAccessTokens (1221819L) .addAccessTokens (1223441L, 134567L) .putAssetsSerialIdMapping ("notebook", 12345L) .build ();

The getter metóda pre Mapa tiež vráti neupraviteľnú mapu na kód klienta.

9. Vnorené stavitelia

Pre aplikácie v reálnom svete možno budeme musieť vnoriť veľa hodnotných objektov pre naše entity domény. A keďže vnorené objekty môžu samy potrebovať implementácie staviteľa, FreeBuilder umožňuje vnorené zostaviteľné typy.

Predpokladajme napríklad, že máme vnorený komplexný typ Adresa v Zamestnanec trieda:

@FreeBuilder verejné rozhranie Adresa {String getCity (); trieda Builder rozširuje Address_Builder {}}

Teraz generuje FreeBuilder stavač metódy, ktoré zaberajú Adresa. Staviteľ ako vstup spolu s Adresa typ:

Address.Builder addressBuilder = nový Address.Builder (); addressBuilder.setCity (CITY_NAME); Zamestnanec zamestnanec = builder.setName ("baeldung") .setAddress (addressBuilder) .build ();

FreeBuilder predovšetkým pridáva metódu prispôsobiť existujúce Adresa objekt v Zamestnanec:

Zamestnanec zamestnanec = builder.setName ("baeldung") .setAddress (addressBuilder) .mateatedress (a -> a.setPinCode (112200)) .build ();

Spolu s FreeBuilder typov, FreeBuilder tiež umožňuje vnorenie ďalších staviteľov, napríklad protos.

10. Budovanie čiastočného objektu

Ako sme už hovorili, program FreeBuilder hodí IllegalStateException pri akomkoľvek porušení obmedzenia - napríklad chýbajúce hodnoty pre povinné polia.

Aj keď je to tak požadované pre produkčné prostredie, komplikuje to testovanie jednotiek, ktoré je nezávislé od obmedzení vo všeobecnosti.

Aby sme tieto obmedzenia uvoľnili, FreeBuilder nám umožňuje vytvárať čiastkové objekty:

Zamestnanec zamestnanec = builder.setName ("baeldung") .setAge (10) .setEmail ("[chránený e-mailom]") .buildPartial (); assertNotNull (employee.getEmail ());

Takže aj keď sme pre znak nenastavili všetky povinné polia Zamestnanec, stále by sme mohli overiť, či e-mail pole má platnú hodnotu.

11. Vlastné natiahnuť() Metóda

S hodnotnými objektmi často musíme pridať zvyk natiahnuť() implementácia. FreeBuilder to umožňuje abstraktné triedy:

@FreeBuilder verejná abstraktná trieda Zamestnanec {abstrakt String getName (); abstract int getAge (); @Override public String toString () {return getName () + "(" + getAge () + "rokov)"; } public static class Builder rozširuje Employee_Builder {}}

Vyhlásili sme Zamestnanec ako abstraktná trieda a nie ako rozhranie a poskytla zvyk natiahnuť() implementácia.

12. Porovnanie s inými knižnicami Builder

Implementácia staviteľa, o ktorej sme hovorili v tomto článku, je veľmi podobná implementácii nástrojov Lombok, Immutables alebo iného procesora anotácií. Avšak existuje niekoľko rozlišovacích znakov o ktorých sme už hovorili:

    • Mapovacie metódy
    • Vnorené zostaviteľné typy
    • Čiastočné objekty

13. Záver

V tomto článku sme pomocou knižnice FreeBuilder vygenerovali triedu builderov v prostredí Java. Implementovali sme rôzne prispôsobenia triedy staviteľov pomocou anotácií, čím sa zníži štandardný kód potrebný na jeho implementáciu.

Tiež sme videli, ako sa FreeBuilder líši od niektorých ďalších knižníc, a stručne sme v tomto článku rozobrali niektoré z týchto charakteristík.

Všetky príklady kódov sú k dispozícii na GitHub.


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