Verfasst von: bletra | 27. Oktober 2011

Singleton vs. static

In der Vorlesung sprach ein Student den Unterschied zwischen Singletons und statischen Klassen an. Diese Frage möchte ich hier gerne aufgreifen.

Methoden und Eigenschaften, die zu einer Klasse gehören, also nicht zu einer einzelnen Instanz, nennt man statisch. Hierfür dient das Schlüsselwort static. Unabhängig von der Anzahl der Instanzen einer Klasse, sind sie einmal vorhanden. Statische Klassen — genauer gesagt statische Methoden oder Eigenschaften einer Klasse — können weder als Parameter übergeben noch von einer Methode zurückgegeben werden. Sie lassen sich auch nicht in eine Liste einfügen (z.B. bei Observer/Ereignissen). Daher können sie auch nicht Bestandteil eines Interfaces oder Eigenschaften anderer Klassen sein. Sie können somit nicht im Sinne von Aggregation oder Komposition verwendet werden. Ein Casten ist ebenfalls nicht möglich, da es keine Instanz zum Casten gibt.

Singleton ist ein Entwurfsmuster, dessen Implementation dafür sorgt, dass es nur eine Instanz dieser Klasse geben kann. Nach außen hin verhält sich ein Singleton wie eine normale Instanz einer Klasse, kann also als Parameter etc. verwendet werden. Ein Singleton kann auch einfach serialisiert werden und so z.B. remote oder in Webdiensten verwendet werden. Im Prinzip ist es ein Geheimnis der Klasse, dass diese einmalig ist, den Nutzern kann es egal sein. Das Singleton-Dasein gehört zur inneren Logik der Klasse. Das Testen von Singletons kann insbesondere bei asynchronen Prozessen schwierig sein. Die Implementation eines Singletons verwendet typischerweise eine statische Eigenschaft. Singletons lassen sich einfach durch polymorphe Klassen austauschen und somit gut bei automatischen Tests durch „Scheinobjekte“ (mocking) simulieren.

Funktionsbibliotheken (z.B. mathematische Funktionen wie sin etc.) werden oft und sinnvollerweise als statische Methoden implementiert, da ihr Rückgabewert nur von den übergebenen Parametern abhängt. Singletons kommen im Kontext von Logging, Authorisierung, Monitoring, Druckaufträge und anderen Diensten zum Einsatz. Hier ist es wichtig, dass es ein hauptverantwortliches Objekt, eben das Singleton gibt. Beide Technologien werden manchmal verwendet, um globale Variablen „einzuschmuggeln“, hier ist natürlich Vorsicht geboten.

Bzgl. der Performance gibt es unterschiedliche Aussagen und je nach Implementation wird ein Singleton erst dann erzeugt, wenn es tatsächlich benötigt wird, während statische Eigenschaften direkt im Speicher angelegt werden. Im Allgemeinen, werden diese Performancedetails jedoch nicht als Argument für die eine odere andere Variante angeführt. Die Verwendung von Singleton bzw. statischen Methoden sollte sich an der Semantik und der geplanten Verwendung orientieren und damit aus dem Zusammenhang ergeben.

Links zum Thema:

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Kategorien

%d Bloggern gefällt das: