Un des classiques de la programmation Java, Effective Java, recommande d'utiliser ʻenum pour implémenter Singleton ("Point 4: Appliquer les caractéristiques de singleton avec un constructeur privé ou un type enum"). L'autre jour, j'ai eu l'occasion d'implémenter Singleton en utilisant ʻenum
dans mon travail, donc j'aimerais conserver l'exemple de code.
Singleton.java
public enum Singleton {
/**Ne doit pas être appelé de l'extérieur de la classe. */
INSTANCE;
private String field;
/**
*Constructeur de facto.
*Seule cette méthode doit être utilisée pour obtenir l'instance.
* @instance de retour
*/
public static Singleton getInstance() {
if (INSTANCE.field == null) {
INSTANCE.field = "field";
}
return INSTANCE;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}
Main.java
public class Main {
public static void main(String[] args) {
Singleton instance1 = Singleton.getInstance();
System.out.println(instance1.getField()); //=> field
instance1.setField("changed field");
//Il semble que cela crée une autre instance,
//En fait, ils utilisent la même instance.
Singleton instance2 = Singleton.getInstance();
System.out.println(instance2.getField()); //=> changed field
}
}
Avec la méthode utilisant class
, il y a plus de points à considérer surtout dans la programmation parallèle, et l'implémentation devient compliquée proportionnellement, mais avec ʻenum, il est possible de réaliser Singleton très simplement. Je peux le faire. Cependant, cet usage diffère de l'usage original de ʻenum
- cela semble être une "astuce", donc "l'interface qui devient un singleton simplement en l'implémentant" est la bibliothèque standard. J'aurais aimé l'avoir dans la section suivante (´ ・ ω ・ `)
Recommended Posts