Einführung in das Singleton Pattern

Das Singleton ist ein Design Pattern und gehört zu der Gruppe der Creational Pattern. Das Pattern ist dazu geeignet, um sicherzustellen, dass ein Objekt nur ein einziges Mal in einem Programm instanziiert werden kann. Zudem kann man global darauf zugreifen. Java bietet verschiedene Möglichkeiten, um ein Singleton zu Implementieren.

Lazy Creation

Bei dieser Variante wird das Singleton-Objekt erst beim ersten Zugriff erzeugt. Das ist dann sinnvoll, wenn man ein speicherschonendes Programm schreiben möchte. Nachteil ist jedoch, dass jeder Zugriff auf das Objekt synchronisiert ist, wodurch sich gleichzeitig zugreifende Threads blockieren. Deshalb sind die folgenden Methoden dieser hier vorzuziehen.

public final class Singleton {

   private static Singleton instance;

   private Singleton() {}

   public synchronized static Singleton getInstance() {
      if (instance == null) {
         instance = new Singleton();
      }
      return instance;
   }
}

Eager Creation

Bei der so genannten Eager Creation wird das Objekt bereits bei der Initialisierung, also beim ersten Referenzieren des Objektes instantiiert.

public final class Singleton {

   private static final Singleton INSTANCE = new Singleton();

   private Singleton() {}

   public static Singleton getInstance() {
      return INSTANCE;
   }
}

Initialization on demand holder idiom

Diese dritte Variante ist quasi eine Mischung aus der Lazy und der Eager Creation. Die Instanziierung des Singleton findet hier erst beim ersten Zugriff auf die getInstance()-Methode statt, da die Instanz in einer inneren Klasse erzeugt wird.

public final class Singleton {

   private static class Holder {
      private static final Singleton INSTANCE = new Singleton();
   }

   private Singleton() {}

   public static Singleton getInstance() {
      return Holder.INSTANCE;
   }
}

Singleton per enum

Ab Java 5 werden auch enums unterstützt. Ein enum kann man deshalb auch dazu missbrauchen, um ein Singleton zu kreieren. Nachteil dieser Variante ist, dass man keine Klassen hiervon ableiten kann.

public enum Singleton {
   INSTANCE;
}

Schlussbemerkung

Singletons sind nicht ganz unumstritten in der modernen Softwareentwicklung. Dennoch ist es eine komfortable Möglichkeit, um sicherzugehen, dass nur eine Instanz einer Klasse erzeugt werden kann. Vor dem Einsatz eines Singleton sollte man sind ganz genau überlegen, ob das Problem nicht doch irgendwie anders gelöst werden kann.

Frage an euch: Falls sich überhaupt ein paar Java-Entwickler unter uns befinden (bitte melden :) ), möchtet ihr zur Benutzung der Singletons noch Beispiele haben, oder reichen euch diese Codeschnipsel aus? Wie seht ihr die Verwendung von Singletons an?

Veröffentlicht am 28.10.2010

5 Kommentare

  • Basti schrieb am 28. Oktober 2010

    Wenn ich nur eine Instanz einer Klasse brauche, erstelle ich eben auch nur eine und gut ists.
    Mit einem Dependency-Injection Framework ist das dann auch leicht zu handlen.

    Das mit dem global zugreifen ist auch eher ein Problem als dass es ein Vorteil ist(bei dir hörte sich das so an).
    Natürlich kommt es da auch wieder darauf an was die Singleton-Klasse genau darstellen soll, bei einer Logger-Klasse o.ä. ist das wohl noch okay.

    Ansonsten bin ich klar für die enum-Variante, die Anderen haben einige Schwachstellen. Per Reflection oder Serialisierung ist es auch dort ohne Probleme möglich mehrere Objekte zu erstellen, um dies zu verhindern muss einiges getan werden (leider wird dies zu selten erwähnt und erklärt, wie man auch dies unterbinden kann).
    Bei dem enum allerdings hat man diese Probleme nicht!

    Ansonsten steht ja auch schon einiges in dem o.g. Link =)

    …just my 2 cents :)

  • Patrick schrieb am 28. Oktober 2010

    Nehmen wir mal den Logger: dort ist es von Vorteil, global drauf zugreifen zu können ;)

  • Fabian Ritzmann schrieb am 28. Oktober 2010

    Nicht unbedingt, mit IoC kann man das eleganter lösen und dann z.B. einfacher eine Loggerimplementierung zu Testzwecken austauschen.

  • Maxim schrieb am 28. Oktober 2010

    Singleton-Klassen sind manchmal echt angenehm. Ich verwende sie z.B. in PHP für den Zugriff auf Websiten-Einstellungen.

  • Le Mag schrieb am 7. November 2010

    Ich vermisse gelegentlich Java in den Vorlesungen. Momentan schauen wir uns andere Sprachen an und “programmieren” mit einer allgemeinen Sprache. Gerechterweise muss man auch sagen das es sich um die Vorlesung Algorithmen handelt und in der Problemlösungen im Vordergrund stehen.

    Java ist eine der schönsten Sprachen. Schade das Sun pleite ist und von Oracel übernommen wurde.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>