De Java Builder maken voor een klas in IntelliJ

1. Inleiding

Het ontwerppatroon van Builder is een van de meest gebruikte creatieve patronen. Het helpt ons om complexe objecten te construeren.

Het met de hand schrijven van bouwers is omslachtig en foutgevoelig. Daarom moeten we speciale tools gebruiken om ze waar mogelijk automatisch te genereren.

In deze tutorial onderzoeken we verschillende manieren om automatisch builder-klassen te maken in de IntelliJ IDE. We zullen de ingebouwde functies die IntelliJ uit de doos biedt, bekijken, evenals de plug-ins van derden.

2. Eerste installatie

In dit artikel gebruiken we versie 2019.1.3 van IntelliJ IDEA Community-editie, de meest recente release op het moment van schrijven. Alle technieken die in de voorbeelden worden gepresenteerd, zouden echter ook goed moeten werken met elke andere versie van IDEA.

Laten we beginnen met het definiëren van de Boek klasse waarvoor we een builder genereren:

openbare klasse Book {private String title; privé auteur auteur; privé LocalDate publishDate; privé int pageCount; // standaard constructor (s), getters en setters}

3. Gebruik van de ingebouwde functionaliteit van IntelliJ

Om een ​​builder te genereren voor het Boek klasse met behulp van de ingebouwde tools van IntelliJ, hebben we een geschikte constructor nodig.

Laten we er een maken:

openbaar boek (String titel, auteur auteur, LocalDate publishDate, int pageCount) {this.title = title; this.author = auteur; this.publishDate = publishDate; this.pageCount = pageCount; }

Nu zijn we klaar om een ​​bouwer te maken. Laten we daarom de cursor op de gemaakte constructor plaatsen en het Refactor dit pop-up door op te drukken Ctrl + Alt + Shift + T (op pc) en selecteer Vervang Constructor door Builder refactoring:

We kunnen enkele van de opties voor de builder-klasse verder aanpassen, zoals de naam en het doelpakket:

Als resultaat hebben we het BookBuilder klasse:

openbare klasse BookBuilder {private String-titel; privé auteur auteur; privé LocalDate publishDate; privé int pageCount; openbare BookBuilder setTitle (String-titel) {this.title = title; dit teruggeven; } openbare BookBuilder setAuthor (auteur auteur) {this.author = auteur; dit teruggeven; } openbare BookBuilder setPublishDate (LocalDate publishDate) {this.publishDate = publishDate; dit teruggeven; } openbare BookBuilder setPageCount (int pageCount) {this.pageCount = pageCount; dit teruggeven; } openbaar boek createBook () {retourneer nieuw boek (titel, auteur, publishDate, pageCount); }}

3.1. Custom Setters Prefix

Het is gebruikelijk om een met prefix voor setter-methoden in builder-klassen.

Om het standaardvoorvoegsel te wijzigen, moeten we de Hernoem Setters Prefix pictogram in de rechterbovenhoek van het optievenster:

3.2. Statische innerlijke bouwer

Sommigen van ons geven er misschien de voorkeur aan om builders te implementeren als statische innerlijke klassen, zoals beschreven door Joshua Bloch in Effective Java.

Als dit het geval is, moeten we een paar extra stappen ondernemen om dit te bereiken met IntelliJ's Vervang Constructor door Builder voorzien zijn van.

Allereerst moeten we handmatig een lege innerlijke klasse maken en de constructor privé maken:

openbare klasse Book {private String title; privé auteur auteur; privé LocalDate publishDate; privé int pageCount; openbare statische klasse Builder {} privéboek (tekenreekstitel, auteur auteur, LocalDate publishDate, int pageCount) {this.title = title; this.author = auteur; this.publishDate = publishDate; this.pageCount = pageCount; } // standaard getters en setters}

Verder moeten we kiezen Gebruik bestaande in het optievenster en wijs naar onze nieuw aangemaakte klasse:

4. Met behulp van InnerBuilder Plugin

Laten we nu kijken hoe we een builder kunnen genereren voor het Boek klasse met behulp van de InnerBuilder-plug-in.

Nadat we de plug-in hebben geïnstalleerd, kunnen we het Genereer pop-up door op te drukken Alt + Invoegen (op pc) en het kiezen van het Bouwer… keuze:

Als alternatief kunnen we de InnerBuilder-plug-in rechtstreeks oproepen door op te drukken Alt + Shift + B (op pc):

Zoals we zien, zijn er een paar opties waaruit we kunnen kiezen om de gegenereerde builder aan te passen.

Laten we eens kijken naar de bouwer die wordt gegenereerd wanneer alle opties zijn uitgeschakeld:

openbare statische laatste klasse Builder {private String-titel; privé auteur auteur; privé LocalDate publishDate; privé int pageCount; public Builder () {} public Builder title (String val) {title = val; dit teruggeven; } public Builder author (Author val) {author = val; dit teruggeven; } public Builder publishDate (LocalDate val) {publishDate = val; dit teruggeven; } openbare Builder pageCount (int val) {pageCount = val; dit teruggeven; } public Book build () {return new Book (this); }}

De InnerBuilder-plug-in implementeert builders standaard als statische innerlijke klassen.

5. Met behulp van de Builder Generator-plug-in

Laten we tot slot eens kijken hoe Builder Generator werkt.

Evenzo kunnen we voor InnerBuilder op Alt + Invoegen (op pc) en kies Bouwer optie of gebruik Alt + Shift + B snelkoppeling.

Zoals we kunnen zien, hebben we drie opties om uit te kiezen voor het aanpassen van het BookBuilder:

Laten we alle opties uitgeschakeld laten en de gegenereerde builder-klasse bekijken:

openbare laatste klasse BookBuilder {private String-titel; privé auteur auteur; privé LocalDate publishDate; privé int pageCount; private BookBuilder () {} openbare statische BookBuilder aBook () {retourneer nieuwe BookBuilder (); } openbare BookBuilder withTitle (String-titel) {this.title = title; dit teruggeven; } openbare BookBuilder withAuthor (auteur auteur) {this.author = auteur; dit teruggeven; } openbare BookBuilder withPublishDate (LocalDate publishDate) {this.publishDate = publishDate; dit teruggeven; } openbare BookBuilder metPageCount (int pageCount) {this.pageCount = pageCount; dit teruggeven; } public Book build () {Book book = new Book (); book.setTitle (titel); book.setAuthor (auteur); book.setPublishDate (publishDate); book.setPageCount (pageCount); retourboek; }}

De eerste optie die de Builder Generator-plug-in biedt om de gemaakte builder-klasse aan te passen - Innerlijke bouwer - spreekt voor zich.

Twee andere zijn echter interessanter en we zullen ze in de volgende secties onderzoeken.

5.1. 'maar' Methode Optie

Als we voor deze optie kiezen, voegt de plug-in een maar() methode naar de BookBuilder klasse:

openbare BookBuilder maar () {retourneer aBook (). withTitle (titel) .withAuthor (auteur) .withPublishDate (publishDate) .withPageCount (pageCount); }

Laten we ons nu eens voorstellen dat we drie boeken willen maken met dezelfde auteur en hetzelfde aantal pagina's, maar met verschillende titels en publicatiedatums. We kunnen een basisbouwer maken met al ingestelde gemeenschappelijke eigenschappen en vervolgens de maar() methode om nieuwe te maken BookBuilders (en Boeks later) eruit.

Laten we een voorbeeld bekijken:

BookBuilder commonBuilder = BookBuilder.aBook (). WithAuthor (johnDoe) .withPageCount (123); Boek my_first_book = commonBuilder.but () .withPublishDate (LocalDate.of (2017, 12, 1)) .withTitle ("My First Book"). Build (); Boek my_second_book = commonBuilder.but () .withPublishDate (LocalDate.of (2018, 12, 1)) .withTitle ("My Second Book"). Build (); Boek my_last_book = commonBuilder.but () .withPublishDate (LocalDate.of (2019, 12, 1)) .withTitle ("My Last Book"). Build ();

5.2. Gebruik een optie voor één veld

Als we deze optie kiezen, bevat de gegenereerde builder een verwijzing naar het gemaakte Boek object in plaats van alle eigenschappen van het boek:

openbare laatste klas BookBuilder {privéboekboek; private BookBuilder () {boek = nieuw boek (); } openbare statische BookBuilder aBook () {retourneer nieuwe BookBuilder (); } openbare BookBuilder withTitle (String-titel) {book.setTitle (titel); dit teruggeven; } openbare BookBuilder withAuthor (auteur auteur) {book.setAuthor (auteur); dit teruggeven; } openbare BookBuilder withPublishDate (LocalDate publishDate) {book.setPublishDate (publishDate); dit teruggeven; } openbare BookBuilder metPageCount (int pageCount) {book.setPageCount (pageCount); dit teruggeven; } public Book build () {retourboek; }}

Dit is een iets andere benadering om een ​​builder-klasse te maken die in bepaalde situaties van pas kan komen.

6. Conclusie

In deze zelfstudie hebben we verschillende manieren onderzocht om builder-klassen in IntelliJ te genereren.

Het is meestal beter om dit soort tools te gebruiken om automatisch onze builders te genereren. Elk van de opties die we hebben gepresenteerd, heeft zijn voor- en nadelen. Welke aanpak we eigenlijk kiezen, is eerder een kwestie van smaak en individuele voorkeuren.