Génération de code de modèle de générateur dans IntelliJ

Existe-t-il un moyen d’automatiser l’écriture de modèles Builder dans IntelliJ?

Par exemple, compte tenu de cette classe simple:

class Film { private Ssortingng title; private int length; public void setTitle(Ssortingng title) { this.title = title; } public Ssortingng getTitle() { return this.title; } public void setLength(int length) { this.length = length; } public int getLength() { return this.length; } } 

y a-t-il un moyen que je puisse obtenir l’IDE pour générer ceci, ou similaire:

 public class FilmBuilder { Film film; public FilmBuilder() { film = new Film(); } public FilmBuilder withTitle(Ssortingng title) { film.setTitle(title); return this; } public FilmBuilder withLength(int length) { film.setLength(length); return this; } public Film build() { return film; } } 

Utilisez le constructeur de remplacement avec le refactoring du générateur.

Pour utiliser cette fonction, cliquez sur la signature du constructeur dans votre code, puis cliquez avec le bouton droit de la souris et sélectionnez le menu “Refactor”, puis cliquez sur “Remplacer le constructeur avec Builder …” pour faire apparaître la boîte de dialog.

J’ai trouvé que la génération de modèles de générateur intégrée dans IntelliJ était un peu compliquée pour plusieurs raisons:

  1. Il doit utiliser un constructeur existant comme référence.
  2. Ce n’est pas rapidement accessible via le menu “Générer” ( command+N sous OS X).
  3. Il ne génère que des classes Builder externes. Comme d’autres l’ont mentionné, il est très courant d’utiliser des classes internes statiques lors de l’implémentation du modèle de générateur.

Le plug-in InnerBuilder résout tous ces problèmes et ne nécessite aucune configuration ni configuration. Voici un exemple de générateur généré par le plugin:

 public class Person { private Ssortingng firstName; private Ssortingng lastName; private int age; private Person(Builder builder) { firstName = builder.firstName; lastName = builder.lastName; age = builder.age; } public static final class Builder { private Ssortingng firstName; private Ssortingng lastName; private int age; public Builder() { } public Builder firstName(Ssortingng firstName) { this.firstName = firstName; return this; } public Builder lastName(Ssortingng lastName) { this.lastName = lastName; return this; } public Builder age(int age) { this.age = age; return this; } public Person build() { return new Person(this); } } } 

Voici comment surmonter les lacunes mentionnées par Mansoor Siddiqui :

1) Il doit utiliser un constructeur existant comme référence.

Ce qui est très facile à générer. Appuyez simplement sur Alt + Ins sous Windows pour appeler le menu Générer et choisissez Constructor .

2) Il n’est pas rapidement accessible via le menu “Générer” (commande + N sous OS X)

Allez simplement dans Settings -> Keymap , recherchez Builder et atsortingbuez-lui un raccourci de votre choix (si vous utilisez cette fonctionnalité très souvent, ce qui est rarement le cas). Vous pouvez affecter Alt + B par exemple.

Une autre alternative est Ctrl + Maj + A (Rechercher une action). Commencez à taper Builder et vous aurez immédiatement access à la commande:

Boîte de dialogue Rechercher une action

Vous pouvez utiliser ce raccourci pour accéder rapidement à toute fonctionnalité IntelliJ IDEA (cela est très utile lorsque vous ne vous rappelez pas exactement à quoi la commande est appelée et où la trouver).

3) Il ne génère que des classes Builder externes. Comme d’autres l’ont mentionné, il est très courant d’utiliser des classes internes statiques lors de l’implémentation du modèle de générateur.

Je préfère aussi mes constructeurs en tant que classes internes statiques. Malheureusement, il n’y a pas de moyen simple de le faire, mais c’est toujours possible. Vous devez simplement définir vous-même la classe interne nestede (laissez-la vide) et, lorsque vous Replace Constructor with Builder boîte de dialog Replace Constructor with Builder , choisissez l’option Use existing option Use existing et sélectionnez votre classe interne. Fonctionne comme un charme! Bien que, il aurait été plus facile de rendre cette option configurable.

Si vous vous demandez si cela peut être utilisé pour créer une classe avec une classe de construction interne telle que décrite par Joshua Block – il suffit de définir d’abord une classe interne vide, puis de cocher “Use existing” et de rechercher votre nouvelle classe ) et appuyez sur “Refactor”.

PS! Le curseur doit résider à l’intérieur du constructeur (pré-écrit) pour pouvoir utiliser la fonction de refactoring “Remplacer le constructeur avec le générateur”.

La façon dont IntelliJ est d’y parvenir, à mon humble avis, est compliquée. Il existe deux plug-ins (je préfère celui-ci: https://plugins.jetbrains.com/plugin/7354 ) qui servent beaucoup mieux le but.

Par exemple, je préfère avoir la classe Builder comme classe interne du PoJo. Pour atteindre cet objective avec IntelliJ, vous avez besoin de quelques coups supplémentaires.

Un autre avantage du plugin est l’emplacement de la fonctionnalité (dans le menu contextuel Generate... ).

En complément de la réponse de @ CrazyCoder, je pense qu’il est très utile de savoir que, dans la partie supérieure droite de la boîte de dialog Remplacer le constructeur avec Builder, il existe un bouton de configuration que vous pouvez utiliser pour renommer le préfixe des parameters.

Pour ceux qui souhaitent remplacer “trop ​​de parameters” par un modèle de générateur, faites “extraire l’object paramètre” puis le constructeur de conversion en générateur mentionné dans d’autres réponses ici.

Générer le constructeur de la classe en cliquant avec le bouton droit sur la classe Generate> Constructor. Ensuite, sous Windows, appuyez sur Ctrl + Maj + A pour rechercher une action et tapez “constructeur”, sélectionnez “Remplacer le constructeur par le générateur ..”

À mon avis, le moyen le plus simple d’obtenir la classe statique interne au lieu d’une classe distincte est la suivante:

  1. Si vous n’avez pas encore de constructeur, générez-en un en utilisant la boîte de dialog Générer un constructeur
  2. Ensuite, utilisez Replace Constructor avec Builder
  3. Déplacer la classe nouvellement créée à la classe initiale en utilisant Déplacer le refactoring (raccourci clavier: F6)