Wikipedia definiert einen Singleton folgendermaßen

Das Singleton (selten auch Einzelstück genannt) ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster und […] stellt sicher, dass von einer Klasse genau ein Objekt existiert. Dieses Singleton ist darüber hinaus üblicherweise global verfügbar.

Das Singleton findet Verwendung, wenn

  • nur ein Objekt zu einer Klasse existieren darf und ein einfacher Zugriff auf dieses Objekt benötigt wird oder
  • das einzige Objekt durch Unterklassenbildung spezialisiert werden soll.

Bei einer Singleton-Klasse sollte defintiv sichergestellt werden, dass der Client das Objekt nicht neu instanziieren kann. Für die Umsetzung des Java Singleton Pattern gibt gibt es generell zwei Möglichkeiten, die ich euch mit den folgenden Code-Beispielen aufzeigen möchte.


Möglichkeit #1

Eine Static-Factory-Methode zum wiedergeben der bereits vorhandenen Instanz…Ganz wichtig, wie bereits erwähnt, der private Konstruktor…

public class SingletonClass {

private static final SingletonClass INSTANCE = new SingletonInstance();

// Privater Konstruktor, ganz wichtig, damit diese Klasse nicht manuell instanziiert werden kann!
private SingletonClass() {
}

// Gibt die einmalige Instanz der Singleton-Klasse wieder
public static SingletonClass getInstance() { return INSTANCE; }

public void otherMethod() { ... }

}

Möglichkeit #2 (Empfohlen)

Die zweite Möglichkeit, die ich allerdings noch nie in einem Produktivsystem gesehen habe, wobei nichts für mich dagegen spricht, ist die Erstellung eines Enums mit einem einzigen Typen. Enums können sowieso nur statisch aufgerufen werden. Der Enum hat einen einzigen Typen, über den dann sämtliche Methoden ausgeführt werden.

public enum SingletonClass {

INSTANCE;

public void otherMethod() { ... }

// Weitere Methoden

}

Diese Methode bietet mehrere Vorteile

  • Bietet eine einfachere Möglichkeit der Serialisierung
  • Garantiert absolut, dass nur eine Instanz existiert, selbst bei Reflection, somit die sicherste Methode
  • Einfache und schnelle Implementierung

Genutzt wird dieser Enum dann wie jeder andere…

SingletonClass.INSTANCE.otherMethod();

Dieser Artikel nimmt sich Effective Java – Second Edition von Joshua Bloch als Vorbild in dem diese Vorschläge zum Java Singleton Pattern vorgeschlagen werden. Weitere Details zum Buch findet ihr unter Effective Java – Second Edition von Joshua Bloch.

Effective Java - Second Edition

Effective Java – Second Edition


2 Comments

Amazon Simple Storage Service Tutorial - Java Codebeispiel · July 9, 2015 at 15:42

[…] zu löschen und abzufragen. Dieser AmazonClient ist ein Enum mit einem einzigen Typen (siehe Java Singleton Pattern – Enum) – dadurch wird versichert, das es nur eine Instanz der Klasse gibt. […]

Amazon Simple Storage Service Tutorial - Java Code sample · August 19, 2018 at 16:14

[…] lets you upload, retreive and delete files. The AmazonClient is an Enum with a single type (see Java Singleton Pattern – Enum) – ensuring that there is only a single instance. The […]

Leave a Reply