Le meilleur idiome Java que j'ai trouvé pour simuler les arguments des mots clés dans les constructeurs est le modèle Builder, décrit dans le document Java efficace 2e édition .
L'idée de base est d'avoir une classe Builder qui possède des setters (mais généralement pas de getters) pour les différents paramètres du constructeur. Il existe également une classe build()
méthode. La classe Builder est souvent une classe (statique) imbriquée dans la classe qu'elle sert à construire. Le constructeur de la classe externe est souvent privé.
Le résultat final ressemble à quelque chose comme :
public class Foo {
public static class Builder {
public Foo build() {
return new Foo(this);
}
public Builder setSize(int size) {
this.size = size;
return this;
}
public Builder setColor(Color color) {
this.color = color;
return this;
}
public Builder setName(String name) {
this.name = name;
return this;
}
// you can set defaults for these here
private int size;
private Color color;
private String name;
}
public static Builder builder() {
return new Builder();
}
private Foo(Builder builder) {
size = builder.size;
color = builder.color;
name = builder.name;
}
private final int size;
private final Color color;
private final String name;
// The rest of Foo goes here...
}
Pour créer une instance de Foo, vous écrivez alors quelque chose comme :
Foo foo = Foo.builder()
.setColor(red)
.setName("Fred")
.setSize(42)
.build();
Les principales mises en garde sont les suivantes :
- La configuration du modèle est assez verbeuse (comme vous pouvez le voir). Cela n'en vaut probablement pas la peine, sauf pour les classes que vous prévoyez d'instancier à de nombreux endroits.
- Il n'y a pas de contrôle à la compilation pour vérifier que tous les paramètres ont été spécifiés exactement une fois. Vous pouvez ajouter des vérifications au moment de l'exécution, ou vous pouvez utiliser ceci uniquement pour les paramètres optionnels et faire des paramètres obligatoires des paramètres normaux pour Foo ou le constructeur du Builder. (Les gens ne s'inquiètent généralement pas du cas où le même paramètre est défini plusieurs fois).
Vous pouvez également consulter cet article de blog (pas par moi).
0 votes
Voir aussi jaksa.wordpress.com/2019/10/28/named-parameters-in-java