Java-Design: So funktioniert das Singleton

Beim Design eines Systems wird üblicherweise gesteuert, wie ein Objekt verwendet wird. Zugleich sollen Anwender daran gehindert werden, Kopien davon herzustellen beziehungsweise neue Instanzen zu erzeugen. Ein Singleton kann beispielsweise verwendet werden, um einen Verbindungspool zu erzeugen. Es ist nicht ratsam, stets eine neue Verbindung herzustellen, wenn ein Programm etwas in eine Datenbank schreiben muss. Stattdessen ist es möglich, eine oder mehrere Verbindungen, bei denen es sich bereits um einen Pool handelt, mittels des Singleton-Musters zu instanzieren.

Das Singleton-Muster wird sehr häufig zusammen mit dem Fabrikmethodenmuster verwendet, um eine systemübergreifende Ressource zu erzeugen, deren spezifischer Typ dem verarbeitenden Code nicht bekannt ist. Ein Beispiel für den gleichzeitigen Einsatz dieser beiden Muster ist das Abstract Windowing Toolkit (AWT). Bei GUI-Anwendungen ist sehr häufig nur eine Instanz eines grafischen Elements pro Anwendungsinstanz erforderlich, etwa das Dialogfeld Drucken oder die Schaltfläche OK.

Potenzielle Probleme beachten

Obwohl das Singleton eines der einfachsten Designmuster ist, gibt es damit einige Probleme:

Konstruktion in Anwendungen mit mehreren Threads

Das Singleton-Muster muss in Anwendungen mit mehreren Threads sorgfältig konstruiert werden. Wenn zwei Threads die Erzeugungsmethode gleichzeitig ausführen sollen und kein Singleton existiert, müssen beide nach einer Singleton-Instanz suchen. Es darf jedoch nur ein Thread das neue Objekt erzeugen. Die klassische Lösung für dieses Problem besteht in einem gegenseitigen Ausschluss bei der Klasse, die angibt, dass das Objekt instanziert wird. Nachfolgend wird eine Thread-sichere Version eines Singletons gezeigt:


Als alternative Lösung kann das synchronisierte Schlüsselwort zur Deklaration der getInstance()-Methode hinzugefügt werden:


public static synchronized Singleton getInstance()

Vorausschauend Klone vermeiden

Es kann trotzdem noch eine Kopie des Singleton-Objekts durch Klonen mittels der clone()-Methode des Objekts hergestellt werden. Um dies zu verhindern, muss die Klonmethode unwirksam gemacht werden. Dadurch entsteht dann eine ClonNotSupportedException-Ausnahme:


Das Finalisieren der Singleton-Klasse bedenken

Die Singleton-Klasse soll unter Umständen finalisiert werden, damit keine Unterklassen von Singletons gebildet werden, die andere Probleme verursachen können.

Auf Speicherbereinigungen achten

Abhängig von der jeweiligen Implementierung könnten die Singleton-Klasse und sämtliche zugehörigen Daten möglicherweise bereinigt werden. Aus diesem Grund muss sichergestellt sein, dass eine aktuelle Referenz auf die Singleton-Klasse vorhanden ist, wenn die Anwendung läuft.

Fazit

Das Singleton-Muster wird sehr häufig genutzt und hat seine praktischen Vorteile bei der Software-Entwicklung unter Beweis gestellt. Obwohl es sich dabei um kein Java-spezifisches Muster handelt, ist es aus der Java-Programmierung nicht mehr wegzudenken. Wenn es auch sehr einfach ist, sollten dennoch die im vorliegenden Artikel beschriebenen Beschränkungen des Singleton-Musters berücksichtigt werden.

Themenseiten: Anwendungsentwicklung, Software

Fanden Sie diesen Artikel nützlich?
Content Loading ...
Whitepaper

Artikel empfehlen:

Neueste Kommentare 

Noch keine Kommentare zu Java-Design: So funktioniert das Singleton

Kommentar hinzufügen

Schreibe einen Kommentar

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