Oprettelse af Java Builder til en klasse i IntelliJ

1. Introduktion

Builder-designmønsteret er et af de mest anvendte skabelsesmønstre. Det hjælper os med at konstruere komplekse objekter.

At skrive bygherrer i hånden er besværligt og fejlbehæftet. Derfor skal vi bruge dedikerede værktøjer til automatisk at generere dem, når det er muligt.

I denne vejledning undersøger vi forskellige måder til automatisk at oprette builder-klasser i IntelliJ IDE. Vi ser på de indbyggede funktioner, IntelliJ leverer ud af kassen såvel som på tredjeparts plugins.

2. Første opsætning

I hele denne artikel bruger vi version 2019.1.3 af IntelliJ IDEA Community-udgaven, som er den seneste udgivelse i skrivende stund. Dog skal alle de teknikker, der præsenteres i eksemplerne, også fungere fint med enhver anden version af IDEA.

Lad os begynde med at definere Bestil klasse, som vi genererer en bygherre for:

public class Book {privat strengetitel; privat forfatter forfatter; privat LocalDate publishDate; private int pageCount; // standardkonstruktør (er), getters og settere}

3. Brug af IntelliJs indbyggede funktionalitet

At generere en bygherre til Bestil klasse ved hjælp af IntelliJs indbyggede værktøjer, har vi brug for en passende konstruktør.

Lad os oprette en:

public Book (String title, Author author, LocalDate publishDate, int pageCount) {this.title = title; denne.forfatter = forfatter; this.publishDate = publishDate; this.pageCount = pageCount; }

Nu er vi klar til at oprette en bygherre. Lad os derfor placere markøren på den oprettede konstruktør og åbne Refaktor dette pop op ved at trykke på Ctrl + Alt + Skift + T. (på pc) og vælg Udskift konstruktør med Builder refactoring:

Vi kan yderligere justere nogle af mulighederne for builder-klassen, som navnet og målpakken:

Som et resultat har vi genereret BookBuilder klasse:

offentlig klasse BookBuilder {privat strengetitel; privat forfatter forfatter; privat LocalDate publishDate; private int pageCount; public BookBuilder setTitle (String title) {this.title = title; returner dette; } offentlig BookBuilder setAuthor (forfatterforfatter) {this.author = author; returner dette; } offentlig BookBuilder setPublishDate (LocalDate publishDate) {this.publishDate = publishDate; returner dette; } offentlig BookBuilder setPageCount (int pageCount) {this.pageCount = pageCount; returner dette; } public Book createBook () {returner ny bog (titel, forfatter, publishDate, pageCount); }}

3.1. Prefix til brugerdefinerede sættere

Det er en almindelig praksis at bruge en med præfiks for settermetoder i builder-klasser.

For at ændre standardpræfikset skal vi vælge Omdøb Setters-præfikset ikon i øverste højre hjørne af indstillingsvinduet:

3.2. Statisk indre bygherre

Nogle af os foretrækker måske at implementere bygherrer som statiske indre klasser som beskrevet af Joshua Bloch i Effektiv Java.

Hvis dette er tilfældet, er vi nødt til at tage et par ekstra skridt for at opnå dette ved hjælp af IntelliJ's Udskift konstruktør med Builder funktion.

Først og fremmest skal vi manuelt oprette en tom indre klasse og gøre konstruktøren privat:

public class Book {privat strengetitel; privat forfatter forfatter; privat LocalDate publishDate; private int pageCount; offentlig statisk klasse Builder {} privat bog (strengetitel, forfatterforfatter, LocalDate publishDate, int pageCount) {this.title = title; denne.forfatter = forfatter; this.publishDate = publishDate; this.pageCount = pageCount; } // standard getters og setters}

Desuden er vi nødt til at vælge Brug eksisterende i valgvinduet og peg på vores nyoprettede klasse:

4. Brug af InnerBuilder Plugin

Lad os nu se, hvordan vi kan generere en builder til Bestil klasse ved hjælp af InnerBuilder-plugin.

Når vi har installeret pluginet, kan vi åbne Frembringe pop op-vindue ved at trykke på Alt + Indsæt (på pc) og vælge Bygger… mulighed:

Alternativt kan vi ringe direkte til InnerBuilder-pluginet ved at trykke på Alt + Skift + B (på pc):

Som vi ser, er der et par muligheder, vi kan vælge imellem for at tilpasse den genererede builder.

Lad os se bygherren genereret, når alle muligheder ikke er markeret:

offentlig statisk endelig klasse Builder {privat streng titel; privat forfatter forfatter; privat LocalDate publishDate; private int pageCount; public Builder () {} public Builder title (String val) {title = val; returner dette; } public Builder author (Author val) {author = val; returner dette; } public Builder publishDate (LocalDate val) {publishDate = val; returner dette; } public Builder pageCount (int val) {pageCount = val; returner dette; } public Book build () {returner ny bog (denne); }}

InnerBuilder-pluginet implementerer bygherrer som statiske indre klasser som standard.

5. Brug af Builder Generator Plugin

Lad os endelig se, hvordan Builder Generator fungerer.

På samme måde som for InnerBuilder kan vi enten trykke Alt + Indsæt (på pc) og vælg Bygger mulighed eller brug Alt + Skift + B genvej.

Som vi kan se, har vi tre muligheder at vælge imellem til at tilpasse BookBuilder:

Lad os lade alle muligheder være markerede og se den genererede builder-klasse:

offentlig endelig klasse BookBuilder {privat strengetitel; privat forfatter forfatter; privat LocalDate publishDate; private int pageCount; privat BookBuilder () {} offentlig statisk BookBuilder aBook () {returner ny BookBuilder (); } public BookBuilder withTitle (String title) {this.title = title; returner dette; } offentlig BookBuilder medAuthor (forfatterforfatter) {this.author = author; returner dette; } offentlig BookBuilder medPublishDate (LocalDate publishDate) {this.publishDate = publishDate; returner dette; } offentlig BookBuilder medPageCount (int pageCount) {this.pageCount = pageCount; returner dette; } public Book build () {Book book = new Book (); book.setTitle (titel); book.setAuthor (forfatter); book.setPublishDate (publishDate); book.setPageCount (pageCount); returbog; }}

Den første mulighed, som Builder Generator-plugin giver til at tilpasse den oprettede builder-klasse - Indre bygherre - er ret selvforklarende.

To andre er dog mere interessante, og vi vil udforske dem i de følgende afsnit.

5.1. 'men' Metodeindstilling

Hvis vi vælger denne mulighed, tilføjer pluginet en men() metode til BookBuilder klasse:

public BookBuilder but () {returner en bog (). withTitle (title) .withAuthor (author) .withPublishDate (publishDate) .withPageCount (pageCount); }

Lad os forestille os, at vi vil oprette tre bøger med samme forfatter og det samme antal sider, men med forskellige titler og udgivelsesdatoer. Vi opretter muligvis en basisbygger med allerede indstillede fælles egenskaber og bruger derefter men() metode til at skabe nyt BookBuilders (og Bestils senere) ud af det.

Lad os se på et eksempel:

BookBuilder commonBuilder = BookBuilder.aBook (). MedAuthor (johnDoe) .withPageCount (123); Book my_first_book = commonBuilder.but () .withPublishDate (LocalDate.of (2017, 12, 1)) .withTitle ("Min første bog"). Build (); Book my_second_book = commonBuilder.but () .withPublishDate (LocalDate.of (2018, 12, 1)) .withTitle ("Min anden bog"). Build (); Book my_last_book = commonBuilder.but () .withPublishDate (LocalDate.of (2019, 12, 1)) .withTitle ("Min sidste bog"). Build ();

5.2. Brug en enkelt feltindstilling

Hvis vi vælger denne mulighed, vil den genererede bygherre holde en henvisning til det oprettede Bestil objekt i stedet for alle bogens egenskaber:

offentlig endelig klasse BookBuilder {privat bogbog; privat BookBuilder () {bog = ny bog (); } offentlig statisk BookBuilder aBook () {returner ny BookBuilder (); } public BookBuilder withTitle (String title) {book.setTitle (title); returner dette; } public BookBuilder withAuthor (forfatterforfatter) {book.setAuthor (forfatter); returner dette; } offentlig BookBuilder medPublishDate (LocalDate publishDate) {book.setPublishDate (publishDate); returner dette; } offentlig BookBuilder medPageCount (int pageCount) {book.setPageCount (pageCount); returner dette; } public Book build () {returbog; }}

Dette er en lidt anden tilgang til at skabe en builder-klasse, der kan komme til nytte i visse situationer.

6. Konklusion

I denne vejledning har vi undersøgt forskellige måder at generere builder-klasser i IntelliJ.

Det er normalt bedre at bruge disse slags værktøjer til automatisk at generere vores bygherrer. Hver af de muligheder, vi har præsenteret, har sine fordele og ulemper. Hvilken tilgang vi faktisk vælger er snarere et spørgsmål om smag og individuelle præferencer.