![translation](https://cdn.durumis.com/common/trans.png)
Dies ist ein von KI übersetzter Beitrag.
Sprache auswählen
Von durumis AI zusammengefasster Text
- Ein Singleton ist eine Klasse, die nur eine Instanz erzeugen kann. Sie wird verwendet, um zustandslose Objekte oder eindeutige Systemkomponenten zu erstellen.
- Es gibt drei Möglichkeiten, ein Singleton zu erstellen: ein öffentliches statisches Mitglied, das ein finales Feld ist, eine statische Fabrikmethode und die Verwendung eines Aufzähltyps. Die Verwendung eines Aufzähltyps ist die beste Methode.
- Wenn eine Singleton-Klasse serialisiert wird, muss Serializable implementiert werden, alle Instanzfelder müssen als transient deklariert werden und die Methode readResolve() muss überschrieben werden.
Singleton
Das Singleton-Konzept
Ein Singleton ist eine Klasse, die nur eine einzige Instanz erstellen kann. Typische Beispiele für Singletons sind zustandlose Objekte oder eindeutige Systemkomponenten. Allerdings ist es schwierig, Singleton-Klassen zu testen, wenn der Typ nicht als Schnittstelle definiert ist und eine Implementierung daraus erzeugt wird.
So erstellen Sie ein Singleton
public static Member als final Feld
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
public void speak() {
System.out.println("elvis");
}
Der private Konstruktor wird nur einmal beim Initialisieren der Elvis-Instanz aufgerufen und stellt sicher, dass es sich um die einzige Instanz im gesamten System handelt. Es ist jedoch möglich, den privaten Konstruktor mit AccessibleObject.setAccessible() aufzurufen. Diese Manipulation durch Reflexion kann durch das Auslösen einer Ausnahme beim Erstellen des zweiten Objekts verhindert werden.
- Vorteile
- Es wird in der API deutlich, dass die Klasse ein Singleton ist.
- Knappheit.
Statische Fabrikmethode, die mit public static bereitgestellt wird
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {
}
public static Elvis getInstance() {
return INSTANCE;
}
public void speak() {
System.out.println("elvis");
}
Mit Ausnahme von Manipulationen durch Reflexion stellt auch diese Methode sicher, dass es sich um die einzige Instanz im gesamten System handelt. Nur das Feld ist privat und die Objekt zurückgabe erfolgt über eine statische Fabrikmethode.
- Vorteile
- Sie können ein Singleton in ein Nicht-Singleton ändern, ohne die API zu ändern.
- Sie können beispielsweise verschiedene Instanzen pro Thread erstellen, die von der statischen Fabrikmethode zurückgegeben werden.
- Sie können es in eine generische Singleton-Fabrikmethode ändern, wenn Sie möchten.
- Der Methodenverweis der statischen Fabrik kann als Anbieter verwendet werden.
- Sie können beispielsweise Elvis::getInstance anstelle von Supplier<Elvis> verwenden.
- Sie können ein Singleton in ein Nicht-Singleton ändern, ohne die API zu ändern.
Wenn Sie die oben genannten Vorteile nicht nutzen möchten, ist es besser, die erste Methode zu verwenden.
Verwendung des Aufzählungstyps
public enum Elvis {
INSTANCE;
public void speak() {
System.out.println("elvis");
}
Die beste Methode ist die Verwendung des Aufzählungstyps. Im Vergleich zu den beiden oben genannten Methoden ist sie sicherer gegen Reflexionsangriffe und der Code ist übersichtlicher. Darüber hinaus müssen Sie, wie weiter unten beschrieben, bei den beiden oben genannten Methoden zusätzliche Codezeilen für die Serialisierung hinzufügen.
Beachten Sie jedoch, dass ein zu erstellendes Singleton eine Schnittstelle erben kann, aber keine Klasse.
Was ist bei der Serialisierung von Singleton-Klassen zu beachten?
Wenn Sie eine Singleton-Klasse erstellen, die die erste oder zweite Methode verwendet, müssen Sie, abgesehen davon, dass Sie Serializable implementieren, alle Instanzfelder als transient deklarieren und die Methode readResolve() überschreiben.
private Object readResolve throws ObjectStreamException {
return INSTANCE;
Quelle
- Effektives Java
- https://catsbi.oopy.io/d7f3a636-b613-453b-91c7-655d71fda2b1