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:
command+N
sous OS X). 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:
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: