La Motivation
Récemment, j'ai cherché un moyen d'initialiser un objet complexe sans passer beaucoup de paramètre au constructeur. Je l'ai essayé avec le générateur de modèle, mais je n'aime pas le fait que je ne suis pas en mesure de vérifier au moment de la compilation si j'ai vraiment mis toutes les valeurs nécessaires.
Traditionnelle générateur de modèle
Lorsque j'utilise le générateur de modèle pour créer mon Complex
objet, la création est plus "typesafe", parce qu'il est plus facile de voir ce qu'un argument est utilisé pour:
new ComplexBuilder()
.setFirst( "first" )
.setSecond( "second" )
.setThird( "third" )
...
.build();
Mais maintenant j'ai le problème, que je peux facilement passer à côté d'un paramètre important. Je peux vérifier à l'intérieur de l' build()
méthode, mais c'est seulement au moment de l'exécution. Au moment de la compilation il n'y a rien qui me prévient, si j'ai raté quelque chose.
Amélioré le générateur de modèle
Maintenant, mon idée était de créer un constructeur, qui "rappelle" moi, si j'ai raté un des paramètres nécessaires. Mon premier essai ressemble à ceci:
public class Complexe { private String m_first; private String m_second; private String m_third; Complexe privé() {} public static de la classe ComplexBuilder { Complexe privé m_complex; public ComplexBuilder() { m_complex = new Complexe(); } public Builder2 setFirst( la Chaîne ) { m_complex.m_first = premier; de retour de nouvelle Builder2(); } public class Builder2 { privé Builder2() {} Builder3 setSecond( deuxième Chaîne ) { m_complex.m_second = deuxième; de retour de nouvelle Builder3(); } } public class Builder3 { privé Builder3() {} Builder4 setThird( Chaîne de troisième ) { m_complex.m_third = tiers; de retour de nouvelle Builder4(); } } public class Builder4 { privé Builder4() {} Complexe build() { retour m_complex; } } } }
Comme vous pouvez le voir, chaque poseur de le constructeur de la classe retourne différentes interne constructeur de la classe. Interne de chaque constructeur de la classe fournit exactement une méthode de définition et le dernier ne fournit qu'une méthode build ().
Maintenant, la construction d'un objet nouveau ressemble à ceci:
new ComplexBuilder()
.setFirst( "first" )
.setSecond( "second" )
.setThird( "third" )
.build();
...mais il n'y a pas moyen d'oublier un des paramètres nécessaires. Le compilateur n'accepte pas.
Les paramètres facultatifs
Si j'avais des paramètres facultatifs, je voudrais utiliser la dernière interne constructeur de la classe Builder4
pour les définir comme "traditionnelles" générateur de fait, le retour lui-même.
Questions
- Est-ce un bien connus modèle? A-t-elle un nom particulier?
- Voyez-vous des inconvénients?
- Avez-vous des idées pour améliorer la mise en œuvre - dans le sens de moins de lignes de code?