10
votes

Comment marquer une méthode obligatoire?

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 corps () , tête () , , et bien sûr build () et vous envisagez des méthodes tête () et build () obligatoire pour l'utilisateur de cette classe.

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.

est-il possible de faire? De quelle manière suggéreriez-vous?


2 commentaires

Doutez que vous puissiez le faire au moment de la compilation, sauf dans les cas spéciaux très . 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 est appelé, mais je suis curieux si quelqu'un a une meilleure idée.


6 Réponses :


1
votes

aucun moyen avec le compilateur.

Vous pouvez faire une exception d'exécution à partir de la méthode Build () que le générateur n'est pas correctement initialisé (et un test invoqué dans la phase de test Maven)

Mais vous pouvez également avoir Build (..) Accepter un HeadDétails objet. De cette façon, vous ne pouvez pas invoquer la construction sans spécifier les paramètres obligatoires.


0 commentaires

0
votes

Peut-être à l'intérieur de Build () Vous pouvez vérifier si toutes les méthodes requises ont été appelées. Behaps the Personne a une vérification de la santé mentale interne qui est déclenchée par Build () .

Bien sûr, ce comportement d'exécution de chèques et n'est pas une analyse statique comme vous le décrivez.


0 commentaires

0
votes

n'est pas possible d'appeler ces méthodes dans le constructeur de la personne?


1 commentaires

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.



1
votes

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 {
}
}


2 commentaires

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.



3
votes

Je crois que l'utilisation correcte du modèle de constructeur résoudrait le problème que vous rencontrez.

Je créerais des classes PersonBuilder qui contiendrait les méthodes SETDY () et SETARMS () 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 () retournerait la nouvelle instance de personne . xxx

Alternativement que vous pouvez passer le Tête paramètre sur la méthode Build () mais je préfère la passer dans le constructeur à la place.


0 commentaires

24
votes

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): xxx


Edit

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.


3 commentaires

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")