Einer der Java-Programmierklassiker, Effective Java, empfiehlt die Verwendung von "enum" zur Implementierung von Singleton ("Punkt 4: Erzwingen von Singleton-Eigenschaften mit einem privaten Konstruktor oder Aufzählungstyp"). Neulich hatte ich die Möglichkeit, Singleton mit "enum" in meiner Arbeit zu implementieren, daher möchte ich den Beispielcode behalten.
Singleton.java
public enum Singleton {
/**Darf nicht von außerhalb der Klasse angerufen werden. */
INSTANCE;
private String field;
/**
*De-facto-Konstruktor.
*Nur diese Methode sollte verwendet werden, um die Instanz abzurufen.
* @Instanz zurückgeben
*/
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");
//Es sieht so aus, als würde eine weitere Instanz erstellt.
//Tatsächlich verwenden sie dieselbe Instanz.
Singleton instance2 = Singleton.getInstance();
System.out.println(instance2.getField()); //=> changed field
}
}
Bei der Methode mit "class" sind insbesondere bei der parallelen Programmierung weitere Punkte zu beachten, und die Implementierung wird proportional kompliziert, aber mit "enum" ist es möglich, Singleton sehr einfach zu realisieren. Ich kann es schaffen Diese Verwendung weicht jedoch von der ursprünglichen Verwendung von "enum" ab - es scheint ein "Trick" zu sein, daher ist "Schnittstelle, die nur durch Implementierung zu einem Singleton wird" die Standardbibliothek. Ich wünschte, ich hätte es im nächsten Abschnitt (´ ・ ω ・ `)
Recommended Posts