Au cours de la rédaction des directives de code pour une entreprise, je me suis retrouvé à recommander d'utiliser le modèle Builder d'Efficace Java, au lieu de constructeurs télescopiques.
Cependant, après y avoir réfléchi un peu plus, une solution plus élégante consiste sûrement à supprimer simplement la classe de générateur et à supprimer également les constructeurs supplémentaires avec des arguments facultatifs.
Il suffit donc d'avoir un constructeur avec les paramètres requis, des getters / setters normaux et de commenter le code. Lors de l'implémentation, créez simplement une nouvelle instance de yr object puis définissez les valeurs.
Ma pensée originale était que l'avantage était de supprimer la confusion quant aux paramètres facultatifs et à ceux qui étaient requis; cependant, le véritable avantage vient de l'utilisation du chaînage de méthode / de l'interface fluide.
Le modèle de générateur présente des avantages lorsque vous créez de nombreuses nouvelles instances car l'idé peut faire le travail de jambe et également s'il existe de nombreux (15+) paramètres facultatifs. Cependant, cela vaut-il le temps supplémentaire de coder la classe interne statique, recommanderiez-vous d'utiliser le générateur, ou est-ce une perte de temps?
Réponses:
J'ai tendance à suivre un modèle selon lequel les constructeurs devraient fournir toutes les valeurs obligatoires requises pour créer un objet valide et cohérent . Pour les valeurs facultatives, j'essaie de réfléchir à la valeur par défaut la plus courante, afin que les setters soient utilisés le moins possible.
Si je trouve qu'il y a beaucoup de valeurs facultatives ou qu'une plus grande proportion de valeurs facultatives ont tendance à être modifiées par rapport à leurs valeurs par défaut, alors j'utiliserai le modèle de générateur (générateur interne statique ou autre conception similaire).
Josh donne généralement de très bons conseils - la meilleure chose que j'aime chez lui est que les conseils viennent des tranchées - il admet qu'il a fait des erreurs dans la conception de parties de Java, et Java efficace est en partie une sorte de `` remède '' parler :-)
la source
Le modèle Builder de Josh Bloch, tout comme le modèle GoF Builder, offre un moyen de créer un objet immuable avec beaucoup de données par défaut sans de longues listes de constructeurs chaînés.
Si vous "avez le seul constructeur avec les paramètres requis, les getters / setters normaux", alors votre objet n'est plus immuable. c'est à dire. Vous pouvez le changer longtemps après l'avoir instancié.
Si ce n'est pas un problème pour vous, vous n'avez jamais eu besoin du modèle Builder en premier lieu. Si c'est un problème, votre solution est défectueuse.
la source