Vytvorenie Java Builderu pre triedu v IntelliJ

1. Úvod

Dizajnový vzor Builder je jedným z najbežnejšie používaných tvorivých vzorov. Pomáha nám konštruovať zložité objekty.

Ručné písanie staviteľov je ťažkopádne a náchylné na chyby. Preto by sme mali používať vyhradené nástroje na ich automatické generovanie, kedykoľvek je to možné.

V tomto tutoriáli preskúmame rôzne spôsoby automatického vytvárania tried zostavovača v IntelliJ IDE. Pozrime sa na vstavané funkcie, ktoré IntelliJ poskytuje po vybalení, ako aj na doplnky tretích strán.

2. Počiatočné nastavenie

V tomto článku budeme používať verziu 2019.1.3 vydania IntelliJ IDEA Community, ktorá je v čase písania článku najnovšou verziou. Všetky techniky uvedené v príkladoch by však mali fungovať dobre aj v prípade akejkoľvek inej verzie IDEA.

Začnime definovaním Kniha trieda, pre ktorú vygenerujeme staviteľ:

public class Book {private String title; súkromný autor autor; private LocalDate publishDate; private int pageCount; // štandardné konštruktory, getre a setre}

3. Používanie vstavanej funkcie IntelliJ

Generovať staviteľa pre Kniha triedy pomocou zabudovaných nástrojov IntelliJ potrebujeme vhodný konštruktor.

Vytvorme si jeden:

verejná kniha (názov reťazca, autor, autor, LocalDate publishDate, int pageCount) {this.title = názov; this.author = autor; this.publishDate = publishDate; this.pageCount = pageCount; }

Teraz sme pripravení vytvoriť nástroj na tvorbu. Preto umiestnime kurzor na vytvoreného konštruktora a otvorme Refaktor to vyskakovacie okno stlačením Ctrl + Alt + Shift + T (na PC) a vyberte Vymeňte konštruktor za Builder refaktoring:

Ďalej môžeme upraviť niektoré z možností triedy staviteľov, napríklad jej názov a cieľový balík:

Vo výsledku sme vygenerovali BookBuilder trieda:

public class BookBuilder {private String title; súkromný autor autor; private LocalDate publishDate; private int pageCount; public BookBuilder setTitle (názov reťazca) {this.title = názov; vráťte to; } public BookBuilder setAuthor (autor autor) {this.author = autor; vráťte to; } public BookBuilder setPublishDate (LocalDate publishDate) {this.publishDate = publishDate; vráťte to; } public BookBuilder setPageCount (int pageCount) {this.pageCount = pageCount; vráťte to; } public Book createBook () {return new Book (title, author, publishDate, pageCount); }}

3.1. Predpona vlastných nastavovačov

Je bežnou praxou používať a s predpona pre nastavovacie metódy v triedach stavačov.

Ak chcete zmeniť predvolenú predponu, musíme zvoliť Premenovať predponu Setters ikona v pravom hornom rohu okna možností:

3.2. Static Inner Builder

Niektorí z nás môžu uprednostniť implementáciu stavačov ako statických vnútorných tried, ako ich popísal Joshua Bloch v dokumente Effective Java.

Ak je to tak, musíme urobiť niekoľko ďalších krokov, aby sme to dosiahli pomocou IntelliJ Vymeňte konštruktor za Builder vlastnosť.

Najskôr musíme manuálne vytvoriť prázdnu vnútornú triedu a urobiť konštruktor súkromným:

public class Book {private String title; súkromný autor autor; private LocalDate publishDate; private int pageCount; public static class Builder {} private Book (názov reťazca, autor, autor, LocalDate publishDate, int pageCount) {this.title = title; this.author = autor; this.publishDate = publishDate; this.pageCount = pageCount; } // štandardní zakladatelia a zakladatelia}

Ďalej si musíme vybrať Použiť existujúce v okne možností a ukážte na našu novo vytvorenú triedu:

4. Používanie doplnku InnerBuilder

Pozrime sa teraz, ako môžeme vygenerovať program na vytváranie súborov Kniha triedy pomocou doplnku InnerBuilder.

Po nainštalovaní doplnku môžeme otvoriť Generovať vyskakovacie okno stlačením Alt + Vložiť (na PC) a výber Staviteľ… možnosť:

Prípadne môžeme zavolať plugin InnerBuilder priamo stlačením Alt + Shift + B (na PC):

Ako vidíme, na prispôsobenie vygenerovaného nástroja na zostavenie si môžeme vybrať z niekoľkých možností.

Pozrime sa, ako sa generuje tvorca, keď nie sú začiarknuté všetky možnosti:

public static final class Builder {private String title; súkromný autor autor; private LocalDate publishDate; private int pageCount; public Builder () {} public builder title (String val) {title = val; vráťte to; } public Builder autor (Author val) {author = val; vráťte to; } public Builder publishDate (LocalDate val) {publishDate = val; vráťte to; } public Builder pageCount (int val) {pageCount = val; vráťte to; } public Book build () {return new Book (this); }}

Doplnok InnerBuilder implicitne implementuje stavače ako statické vnútorné triedy.

5. Používanie doplnku Builder Generator

Na záver sa pozrime, ako funguje Builder Generator.

Podobne ako v prípade InnerBuilder, môžeme buď stlačiť Alt + Vložiť (na PC) a vyberte Staviteľ možnosť alebo použitie Alt + Shift + B skratka.

Ako vidíme, máme na výber tri možnosti prispôsobenia BookBuilder:

Nechajme všetky možnosti nezaškrtnuté a pozrieme si vygenerovanú triedu builderov:

public final class BookBuilder {private String title; súkromný autor autor; private LocalDate publishDate; private int pageCount; private BookBuilder () {} public static BookBuilder aBook () {return new BookBuilder (); } public BookBuilder withTitle (názov reťazca) {this.title = názov; vráťte to; } public BookBuilder withAuthor (autor autor) {this.author = autor; vráťte to; } public BookBuilder withPublishDate (LocalDate publishDate) {this.publishDate = publishDate; vráťte to; } public BookBuilder withPageCount (int pageCount) {this.pageCount = pageCount; vráťte to; } public Book build () {Book book = new Book (); book.setTitle (názov); book.setAuthor (autor); book.setPublishDate (publishDate); book.setPageCount (pageCount); spiatočná kniha; }}

Prvá možnosť, ktorú poskytuje doplnok Builder Generator, na prispôsobenie vytvorenej triedy staviteľa - Vnútorný staviteľ - je skôr samozrejmý.

Dve ďalšie sú však zaujímavejšie a my ich preskúmame v nasledujúcich častiach.

5.1. 'ale' Metóda Možnosť

Ak zvolíme túto možnosť, doplnok pridá a ale() metóda do BookBuilder trieda:

public BookBuilder but () {return aBook (). withTitle (title) .withAuthor (author) .withPublishDate (publishDate) .withPageCount (pageCount); }

Teraz si predstavme, že chceme vytvoriť tri knihy s rovnakým autorom a rovnakým počtom strán, ale s rôznymi názvami a dátumami vydania. Môžeme vytvoriť základný builder s už nastavenými spoločnými vlastnosťami a potom použiť ale() metóda na vytvorenie nového BookBuilders (a Knihas neskôr) z toho.

Pozrime sa na príklad:

BookBuilder commonBuilder = BookBuilder.aBook (). WithAuthor (johnDoe) .withPageCount (123); Kniha my_first_book = commonBuilder.but () .withPublishDate (LocalDate.of (2017, 12, 1)) .withTitle ("Moja prvá kniha"). Build (); Book my_second_book = commonBuilder.but () .withPublishDate (LocalDate.of (2018, 12, 1)) .withTitle ("Moja druhá kniha"). Build (); Book my_last_book = commonBuilder.but () .withPublishDate (LocalDate.of (2019, 12, 1)) .withTitle ("My Last Book"). Build ();

5.2. Použite možnosť jedného poľa

Ak zvolíme túto možnosť, vygenerovaný tvorca bude mať odkaz na vytvorené Kniha objekt namiesto všetkých vlastností knihy:

verejná posledná trieda BookBuilder {súkromná kniha kníh; private BookBuilder () {book = new Book (); } public static BookBuilder aBook () {return new BookBuilder (); } public BookBuilder withTitle (názov reťazca) {book.setTitle (názov); vráťte to; } public BookBuilder withAuthor (autor autor) {book.setAuthor (autor); vráťte to; } public BookBuilder withPublishDate (LocalDate publishDate) {book.setPublishDate (publishDate); vráťte to; } verejný BookBuilder withPageCount (int pageCount) {book.setPageCount (pageCount); vráťte to; } public Book build () {návratová kniha; }}

Toto je trochu odlišný prístup k vytvoreniu triedy staviteľov, ktorá by sa v určitých situáciách mohla hodiť.

6. Záver

V tomto tutoriáli sme preskúmali rôzne spôsoby generovania tried staviteľa v IntelliJ.

Spravidla je lepšie používať tieto druhy nástrojov na automatické generovanie našich staviteľov. Každá z ponúkaných možností má svoje klady a zápory. Ktorý prístup vlastne zvolíme, je skôr vecou vkusu a individuálnych preferencií.


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