Opprette Java Builder for en klasse i IntelliJ

1. Introduksjon

Builder designmønsteret er et av de mest brukte skapelsesmønstrene. Det hjelper oss med å konstruere komplekse gjenstander.

Å skrive utbyggere for hånd er tungvint og feilutsatt. Derfor bør vi bruke dedikerte verktøy for å automatisk generere dem når det er mulig.

I denne opplæringen vil vi utforske forskjellige måter å automatisk opprette byggeklasser i IntelliJ IDE. Vi tar en titt på de innebygde funksjonene IntelliJ tilbyr utenom esken, så vel som på tredjeparts plugins.

2. Første oppsett

Gjennom denne artikkelen bruker vi versjon 2019.1.3 av IntelliJ IDEA Community-utgaven, som er den siste utgivelsen i skrivende stund. Imidlertid bør alle teknikkene som er presentert i eksemplene, fungere bra med alle andre versjoner av IDEA.

La oss begynne med å definere Bok klasse som vi genererer en byggherre for:

public class Book {private String title; privat forfatterforfatter; privat LocalDate publishDate; private int pageCount; // standard konstruktør (er), getters og setters}

3. Bruke IntelliJs innebygde funksjonalitet

Å generere en byggmester for Bok klasse ved bruk av IntelliJs innebygde verktøy, trenger vi en passende konstruktør.

La oss lage en:

public Book (Stringtittel, Forfatterforfatter, LocalDate publishDate, int pageCount) {this.title = title; denne.forfatter = forfatter; this.publishDate = publishDate; this.pageCount = pageCount; }

Nå er vi klare til å lage en byggherre. La oss derfor plassere markøren på den opprettede konstruktøren og åpne Refactor Dette popup ved å trykke Ctrl + Alt + Skift + T. (på PC) og velg Bytt ut Constructor med Builder refactoring:

Vi kan videre justere noen av alternativene for byggeklassen, som navn og målpakke:

Som et resultat har vi generert BookBuilder klasse:

public class BookBuilder {private String title; privat forfatterforfatter; privat LocalDate publishDate; private int pageCount; offentlig BookBuilder setTitle (strengetittel) {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 bok (tittel, forfatter, publishDate, pageCount); }}

3.1. Custom Setters Prefix

Det er vanlig å bruke en med prefiks for settermetoder i byggeklasser.

For å endre standard prefikset, må vi velge Gi nytt navn til Setters prefiks ikonet øverst til høyre i alternativvinduet:

3.2. Statisk indre byggmester

Noen av oss foretrekker kanskje å implementere byggere som statiske indre klasser som beskrevet av Joshua Bloch i Effektiv Java.

Hvis dette er tilfelle, må vi ta noen ekstra skritt for å oppnå dette ved hjelp av IntelliJ Bytt ut Constructor med Builder trekk.

Først og fremst må vi manuelt lage en tom indre klasse og gjøre konstruktøren privat:

public class Book {private String title; privat forfatterforfatter; privat LocalDate publishDate; private int pageCount; public static class Builder {} privat bok (strengetittel, forfatterforfatter, LocalDate publishDate, int pageCount) {this.title = title; denne.forfatter = forfatter; this.publishDate = publishDate; this.pageCount = pageCount; } // standard getters and setters}

Videre må vi velge Bruk eksisterende i alternativvinduet og peker på den nyopprettede klassen vår:

4. Bruke InnerBuilder Plugin

La oss nå se hvordan vi kan generere en byggherre for Bok klasse ved hjelp av InnerBuilder-plugin.

Når vi har installert pluginet, kan vi åpne generere pop-up ved å trykke Alt + Sett inn (på PC) og velge Bygger… alternativ:

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

Som vi ser, er det noen få alternativer vi kan velge mellom for å tilpasse den genererte byggmesteren.

La oss se byggherren som genereres når alle alternativene ikke er merket av:

offentlig statisk sluttklasse Builder {privat strengetittel; privat forfatterforfatter; 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 () {return new Book (this); }}

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

5. Bruke Builder Generator Plugin

Til slutt, la oss se hvordan Builder Generator fungerer.

På samme måte, som for InnerBuilder, kan vi enten trykke Alt + Sett inn (på PC) og velg Bygger alternativ eller bruk Alt + Skift + B. snarvei.

Som vi kan se, har vi tre alternativer å velge mellom for å tilpasse BookBuilder:

La oss la alle alternativene være ukontrollerte og se den genererte byggeklassen:

offentlig finaleklasse BookBuilder {private String title; privat forfatter forfatter; privat LocalDate publishDate; private int pageCount; private BookBuilder () {} offentlig statisk BookBuilder aBook () {returner ny BookBuilder (); } public BookBuilder withTitle (String title) {this.title = title; returner dette; } offentlig BookBuilder withAuthor (forfatterforfatter) {this.author = author; returner dette; } offentlig BookBuilder medPublishDate (LocalDate publishDate) {this.publishDate = publishDate; returner dette; } offentlig BookBuilder withPageCount (int pageCount) {this.pageCount = pageCount; returner dette; } public Book build () {Book book = new Book (); book.setTitle (tittel); book.setAuthor (forfatter); book.setPublishDate (publishDate); book.setPageCount (pageCount); returbok; }}

Det første alternativet som Builder Generator-plugin gir for å tilpasse den opprettede byggeklassen - Indre byggherre - er ganske selvforklarende.

To andre er imidlertid mer interessante, og vi vil utforske dem i de følgende avsnittene.

5.1. 'men' Metode alternativ

Hvis vi velger dette alternativet, vil pluginet legge til et men() metoden til BookBuilder klasse:

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

La oss forestille oss at vi ønsker å lage tre bøker med samme forfatter og samme antall sider, men med forskjellige titler og publiseringsdatoer. Vi kan opprette en basebygger med vanlige egenskaper som allerede er angitt, og deretter bruke men() metode for å lage nye BookBuilders (og Boks senere) ut av det.

La oss ta en titt på et eksempel:

BookBuilder commonBuilder = BookBuilder.aBook (). WithAuthor (johnDoe) .withPageCount (123); Bestill my_first_book = commonBuilder.but () .withPublishDate (LocalDate.of (2017, 12, 1)) .withTitle ("Min første bok"). Build (); Bestill my_second_book = commonBuilder.but () .withPublishDate (LocalDate.of (2018, 12, 1)) .withTitle ("Min andre bok"). Build (); Bestill my_last_book = commonBuilder.but () .withPublishDate (LocalDate.of (2019, 12, 1)) .withTitle ("Min siste bok"). Build ();

5.2. Bruk et enkeltfeltalternativ

Hvis vi velger dette alternativet, vil den genererte byggmesteren ha en referanse til det opprettet Bok objekt i stedet for alle bokens egenskaper:

offentlig endelig klasse BookBuilder {privat bokbok; private BookBuilder () {book = new Book (); } 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 withPageCount (int pageCount) {book.setPageCount (pageCount); returner dette; } public Book build () {returbok; }}

Dette er en litt annen tilnærming for å lage en byggeklasse som kan være nyttig i visse situasjoner.

6. Konklusjon

I denne veiledningen har vi utforsket forskjellige måter å generere byggeklasser i IntelliJ.

Det er vanligvis bedre å bruke slike verktøy for å automatisk generere våre byggere. Hver av alternativene vi har presentert har fordeler og ulemper. Hvilken tilnærming vi faktisk velger er snarere et spørsmål om smak og individuelle preferanser.


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