¿Hay alguna forma de automatizar la escritura de patrones de Builder en IntelliJ?
Por ejemplo, dada esta clase simple:
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;
}
}
¿Hay alguna manera de que pueda hacer que el IDE genere esto o algo similar?
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;
}
}
Encontré que la generación de patrones de constructor incorporada en IntelliJ es un poco torpe por algunas razones:
command+N
en OS X).El complemento InnerBuilder soluciona todas estas deficiencias y no requiere instalación ni configuración. Aquí hay un constructor de muestra generado por el complemento:
fuente
alt+shift+B
,enter
y BAM, que tiene su constructor. : DA continuación, se explica cómo superar las deficiencias mencionadas por Mansoor Siddiqui :
Que es muy fácil de generar. Simplemente presione Alt+ Insen Windows para invocar el menú Generar y elija
Constructor
.Simplemente vaya a
Settings -> Keymap
, búsqueloBuilder
y asígnele un acceso directo de su elección (si usa esta funcionalidad con mucha frecuencia, lo que rara vez es el caso). Puede asignar Alt+ Bpor ejemplo.Otra alternativa es Ctrl+ Shift+ A(Buscar acción). Comience a escribir
Builder
e inmediatamente obtendrá acceso al comando:Puede usar este atajo para acceder rápidamente a cualquier función de IntelliJ IDEA (esto ayuda mucho cuando no recuerda exactamente cómo se llama el comando y dónde encontrarlo).
También prefiero a mis constructores como clases internas estáticas. Desafortunadamente, no hay una forma sencilla de hacerlo, pero aún es factible. Solo tiene que definir la clase interna anidada usted mismo (déjela vacía), y cuando invoque el
Replace Constructor with Builder
diálogo, elija laUse existing
opción y seleccione su clase interna. ¡Funciona de maravilla! Sin embargo, hubiera sido más fácil configurar esta opción.fuente
Si se pregunta si esto se puede usar para crear una clase con una clase de constructor interno como lo describe Joshua Block , solo tiene que definir una clase interna vacía primero, luego marque "Usar existente" y busque su nueva (clase interna ) y presione "Refactor".
¡PD! El cursor debe residir dentro del constructor (escrito previamente) para poder usar la función de refactorización "Reemplazar constructor con constructor".
fuente
La forma de IntelliJ a esto es, en mi humilde opinión, es complicado. Hay dos complementos (prefiero este: https://plugins.jetbrains.com/plugin/7354 ) que sirven mucho mejor para el propósito.
Por ejemplo, prefiero tener la clase Builder como una clase interna de PoJo. Para lograr eso con IntelliJ, necesita algunos golpes adicionales.
Otra ventaja del complemento es la ubicación de la funcionalidad (en el
Generate...
menú contextual).fuente
¡Lombok es la forma más fácil de hacerlo! (Tiene un complemento Intellij para soporte de sintaxis https://plugins.jetbrains.com/plugin/6317-lombok-plugin )
Solo agrega un
@Builder
anotación, y detrás de las paredes agregará una implementación de constructor dentro del objeto.Con Lombok:
Sin Lombok:
Fuente: https://projectlombok.org/features/Builder
fuente
En mi opinión, la forma más sencilla de obtener la clase estática interna en lugar de una separada es:
fuente
Como complemento a la respuesta de @ CrazyCoder, creo que es muy útil saber que en la parte superior derecha del cuadro de diálogo Reemplazar constructor con constructor hay un botón de configuración que puede usar para cambiar el nombre del prefijo de los establecedores.
fuente
Para aquellos que quieran reemplazar "demasiados parámetros" con un patrón de constructor, "extraer objeto de parámetro" y luego convertir el constructor en constructor mencionado en otras respuestas aquí.
fuente
Genere el constructor de la clase haciendo clic derecho en la clase Generar> Constructor. Luego, en Windows, presione Ctrl + Shift + A para buscar la acción y escriba "constructor", seleccione "Reemplazar constructor con constructor ..."
fuente
He encontrado que Effective Inner Builder es la mejor opción, ya que agrega controles nulos y puede comenzar solo con los miembros definidos.
fuente