Supposons que vous créiez une personne de noms de classe à l'aide du motif de constructeur et supposons que la classe de constructeur contienne des méthodes Nous aimerions en quelque sorte marquer ces méthodes obligatoires, si possible à l'aide d'annotations. Si un utilisateur de cette classe tente de construire une instance de personne mais oublié d'appeler l'une de ces méthodes, nous souhaitons avoir une sorte d'avertissement - soit du compilateur Java, soit peut-être d'Eclipse ou de Maven, que nous utilisons pour construire notre projets - l'un d'entre eux ferait. P>
est-il possible de faire? De quelle manière suggéreriez-vous? P> corps () code>,
tête () code>,
,
code> et bien sûr
build () code> et vous envisagez des méthodes
tête () code> et
build () code> obligatoire pour l'utilisateur de cette classe. p>
6 Réponses :
aucun moyen avec le compilateur. P>
Vous pouvez faire une exception d'exécution à partir de la méthode Mais vous pouvez également avoir Build () CODE> que le générateur n'est pas correctement initialisé (et un test invoqué dans la phase de test Maven) P>
Build (..) code> Accepter un
HeadDétails code> objet. De cette façon, vous ne pouvez pas invoquer la construction sans spécifier les paramètres obligatoires. P>
Peut-être à l'intérieur de Bien sûr, ce comportement d'exécution de chèques et n'est pas une analyse statique comme vous le décrivez. P> Build () code> Vous pouvez vérifier si toutes les méthodes requises ont été appelées. Behaps the
Personne code> a une vérification de la santé mentale interne qui est déclenchée par
Build () code>. P>
n'est pas possible d'appeler ces méthodes dans le constructeur de la personne? P>
L'une des idées avec le modèle Builder est que l'utilisateur peut choisir quelles méthodes de constructeur qu'elle souhaite appeler. Un autre est d'éviter les constructeurs avec de nombreux arguments et de nombreuses surcharges (qui couvrent tous les moyens possibles de créer cet objet). J'ai bien peur de ce que vous suggérez peut casser ces avantages. Nous aimerions conserver la liberté de l'utilisateur pour créer l'objet personne avec toutes les méthodes dont ils ont besoin, tout en affirmant que certaines méthodes obligatoires sont appelées, de préférence dans le temps de construction.
Pourquoi ne pas appeler le corps (), la tête (), les armes () dans la construction () - méthode si elle est vraiment obligatoire et de retourner la personne dans la méthode de construction ()?
[modifier] p> Exemple court: P>
public class Builder { private final String bodyProp; private final String headProp; private final String armsProp; private String hearProps; public Builder(String bodyProp, String headProp, String armsProp) { super(); this.bodyProp = bodyProp; // check preconditions here (eg not null) this.headProp = headProp; this.armsProp = armsProp; } public void addOptionalHair(String hearProps) { this.hearProps = hearProps; } public Person build() { Person person = new Person(); person.setBody(buildBody()); // ... return person; } private Body buildBody() { // do something with bodyProp return new Body(); } public static class Person { public void setBody(Body buildBody) { // ... } } public static class Body { } }
d'ailleurs. Si le corps, la tête et les bras ont besoin de paramètres et qu'ils sont également obligatoires, mettez-les ensuite dans le constructeur du constructeur.
Ces méthodes nécessitent des arguments que je devrais envoyer à la méthode de construction (). Ceci est contre le modèle de constructeur comme je le comprends.
Je crois que l'utilisation correcte du modèle de constructeur résoudrait le problème que vous rencontrez.
Je créerais des classes Alternativement que vous pouvez passer le PersonBuilder code> qui contiendrait les méthodes
SETDY () CODE > et
SETARMS () code> et chaque autre méthode de réglage de paramètre facultatif. Le constructeur du constructeur prendrait les paramètres requis. Ensuite, la méthode
build () code> retournerait la nouvelle instance de
personne code>. P>
Tête code> paramètre sur la méthode
Build () code> mais je préfère la passer dans le constructeur à la place. P> P>
Voici un exemple d'utilisation de différents types pour que certaines pièces sont obligatoires (il rend également la commande que vous appelez les méthodes obligatoires): p> L'OP a été tellement impressionné par cette réponse qu'il l'a écrit pleinement dans un blog . C'est tellement intelligent sur le modèle de constructeur qu'un traitement complet mérite d'être référencé ici. P> p>
Edit strong>
C'est une approche très cool! Mais peut-il être fait sans forcer l'ordre, i. e. avec des interfaces comme obligatoires et non médicandatoires?
Non, vous devez forcer la commande car dans chaque interface, vous avez besoin d'une méthode qui renvoie l'étape suivante, donc dès que possible plusieurs méthodes dans l'une des interfaces, vous ne forcerez que d'appeler l'un d'entre eux pour pouvoir naviguer à la L'étape suivante...
Mais vous pouvez ajouter aux méthodes d'interfaces qui n'ajoutent pas de la propriété (par exemple PersonBuilder.NewInstance (). Tête ("Head"). Début (). Un rm ("bras") code>
Doutez que vous puissiez le faire au moment de la compilation, sauf dans les cas spéciaux très i>. Devrait être assez facile d'avoir des chèques comme celui-ci au moment de l'exécution (je le fais tout le temps).
Je ne peux pas imaginer un moyen de faire cet autre puis ajouter des propriétés obligatoires comme des arguments dans le constructeur du constructeur ou jeter une exception lorsque
construire code> est appelé, mais je suis curieux si quelqu'un a une meilleure idée.