Gibt es eine Möglichkeit, das Schreiben von Builder-Mustern in IntelliJ zu automatisieren?
Zum Beispiel angesichts dieser einfachen Klasse:
class Film {
private String title;
private int length;
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return this.title;
}
public void setLength(int length) {
this.length = length;
}
public int getLength() {
return this.length;
}
}
Gibt es eine Möglichkeit, wie ich die IDE dazu bringen könnte, dies oder ähnliches zu generieren:
public class FilmBuilder {
Film film;
public FilmBuilder() {
film = new Film();
}
public FilmBuilder withTitle(String title) {
film.setTitle(title);
return this;
}
public FilmBuilder withLength(int length) {
film.setLength(length);
return this;
}
public Film build() {
return film;
}
}
Ich fand die in IntelliJ integrierte Generierung von Builder-Mustern aus mehreren Gründen etwas umständlich:
command+N
unter OS X) zugänglich .Das InnerBuilder-Plugin behebt alle diese Mängel und erfordert keine Einrichtung oder Konfiguration. Hier ist ein Beispiel-Builder, der vom Plugin generiert wurde:
quelle
alt+shift+B
,enter
und BAM, haben Sie Ihre Erbauer. : DSo überwinden Sie die von Mansoor Siddiqui genannten Mängel :
Welches ist sehr einfach zu generieren. Drücken Sie unter Windows einfach Alt+ Ins, um das Menü Generieren aufzurufen, und wählen Sie
Constructor
.Gehen Sie einfach zu
Settings -> Keymap
, suchen Sie danachBuilder
und weisen Sie ihm eine Verknüpfung Ihrer Wahl zu (wenn Sie diese Funktionalität sehr oft verwenden, was selten der Fall ist). Sie können zum Beispiel Alt+ zuweisen B.Eine andere Alternative ist Ctrl+ Shift+ A(Aktion suchen). Beginnen Sie mit der Eingabe
Builder
und Sie erhalten sofort Zugriff auf den Befehl:Sie können diese Verknüpfung verwenden, um schnell auf eine IntelliJ IDEA-Funktion zuzugreifen (dies ist sehr hilfreich, wenn Sie sich nicht genau erinnern, wie der Befehl aufgerufen wird und wo er zu finden ist).
Ich bevorzuge meine Erbauer auch als statische innere Klassen. Leider gibt es keinen einfachen Weg, aber es ist immer noch machbar. Sie müssen nur die verschachtelte innere Klasse selbst definieren (leer lassen). Wenn Sie den
Replace Constructor with Builder
Dialog aufrufen , wählen Sie dieUse existing
Option und wählen Sie Ihre innere Klasse aus. Klappt wunderbar! Es wäre jedoch einfacher gewesen, diese Option konfigurierbar zu machen.quelle
Wenn Sie sich fragen, ob dies zum Erstellen einer Klasse mit einer inneren Builder-Klasse verwendet werden kann, wie von Joshua Block beschrieben, müssen Sie zuerst eine leere innere Klasse definieren, dann "Vorhandene verwenden" aktivieren und nach Ihrer neu erstellten (inneren Klasse suchen) ) und drücke "Refactor".
PS! Der Cursor muss sich im Konstruktor befinden (vorab geschrieben), damit die Refactoring-Funktion "Konstruktor durch Builder ersetzen" verwendet werden kann.
quelle
Der intelligente Weg dahin ist meiner Meinung nach verworren. Es gibt zwei Plugins (ich bevorzuge dieses: https://plugins.jetbrains.com/plugin/7354 ), die den Zweck viel besser erfüllen.
Zum Beispiel bevorzuge ich die Builder-Klasse als innere Klasse des PoJo. Um dies mit IntelliJ zu erreichen, benötigen Sie einige zusätzliche Striche.
Ein weiteres Plus für das Plugin ist der Speicherort der Funktionalität (im
Generate...
Kontextmenü).quelle
Lombok ist der einfachste Weg, es zu tun! (Es hat ein Intellij-Plugin für die Syntaxunterstützung https://plugins.jetbrains.com/plugin/6317-lombok-plugin )
Fügen Sie einfach eine
@Builder
Anmerkung hinzu, und hinter den Wänden wird eine Builder-Implementierung innerhalb des Objekts hinzugefügt.Mit Lombok:
Ohne Lombok:
Quelle: https://projectlombok.org/features/Builder
quelle
Meiner Meinung nach ist der einfachste Weg, die innere statische Klasse anstelle einer separaten zu erhalten ,:
quelle
Als Ergänzung zur Antwort von @ CrazyCoder halte ich es für sehr nützlich zu wissen, dass sich oben rechts im Dialogfeld " Konstruktor durch Builder ersetzen " eine Konfigurationsschaltfläche befindet, mit der Sie das Präfix der Setter umbenennen können.
quelle
Wenn Sie "zu viele Parameter" durch ein Builder-Muster ersetzen möchten, führen Sie "Parameterobjekt extrahieren" aus und konvertieren Sie dann den Konstruktor in den Builder, der in den anderen Antworten hier erwähnt wird.
quelle
Generieren Sie den Konstruktor der Klasse, indem Sie mit der rechten Maustaste auf Klasse Generieren> Konstruktor klicken. Drücken Sie dann unter Windows Strg + Umschalt + A, um die Aktion zu suchen, und geben Sie "Builder" ein. Wählen Sie "Konstruktor durch Builder ersetzen".
quelle
Ich habe festgestellt, dass der Effective Inner Builder die beste Option ist, da er Nullprüfungen hinzufügt und nur mit den definierten Elementen beginnen kann.
quelle