Singleton-Klassen

8

Gibt es einen Unterschied zwischen einer Singleton-Klasse und einer Klasse mit? alle statischen Mitglieder (d. h. Methoden und Attribute).

Ich konnte keine Instanz finden, bei der 'alle statischen Memberklassen' nicht erreicht werden die gleiche Funktionalität wie die Klasse Singleton-Muster richtig implementieren?

Für z. java.lang.Runtime ist eine echte Singleton-Klasse, wohingegen java.lang.System alle statischen Methoden für den Zugriff hat und lediglich einen privaten Konstruktor hat, um externe Konstruktion zu vermeiden. Weiß jemand, warum Klassen wie Runtime Singleton gemacht und nicht wie java.lang.System implementiert wurden.

Ist es nur, weil es ein saubereres Design wäre (d. h. ein Objekt realistischer nachahmt) oder gibt es hier einen Leistungsvorteil?

    
Flash 15.12.2010, 08:32
quelle

8 Antworten

15

Ja, es gibt einen Unterschied - ein Singleton kann eine Schnittstelle implementieren.

Auch das, was von außen wie ein Singleton aussieht, kann tatsächlich über verschiedene Klassen implementiert werden, wobei die Singleton-Zugriffsmethode (z. B. Runtime.getRuntime() ) zur Ausführungszeit die richtige Instanz erstellen kann. Ich sage nicht, dass das hier passiert ist, aber es ist eine Option.

    
Jon Skeet 15.12.2010, 08:33
quelle
3

Nun, Sie können ein Objekt (und damit ein Singleton) serialisieren und serialisieren (in Java), aber keine statische Klasse.

    
mauris 15.12.2010 08:35
quelle
1

Ein Singleton wird einmal instanziiert.

Eine statische Klasse wird niemals instanziiert.

    
Neil McGuigan 15.12.2010 08:36
quelle
0

Ich glaube, es gibt keinen Unterschied zwischen dem, was du Singleton und Klasse nennst, mit allen statischen Methoden / Membern im Prinzip. In der Tat denke ich, dass das Erstellen einer Klasse mit allen statischen Mitgliedern eine Möglichkeit ist, das Singleton-Idiom zu implementieren. Nun, vielleicht gibt es in Java einen ernsthaften Unterschied, aber ich spreche aus der Sicht von C ++.

    
user500944 15.12.2010 08:40
quelle
0

Ich denke, Sie sollten fragen, was sich zwischen der finalen Klasse mit dem privaten Konstruktor und der statischen Klasse unterscheidet. Da Singleton eine Klasse ist und die Implementierung hängt vom Programmierer ab, der diese Klasse programmiert. Es ist dasselbe wie fragen, was Unterschiede zwischen einem Objekt und einer statischen Klasse ist.

    
Dainius 15.12.2010 08:44
quelle
0

Eine Klasse kann erweitert werden, um ein anderes Singleton (z. B. für Testzwecke) oder eine Nicht-Singleton-Klasse zu erstellen. Statische Methoden können nicht überschrieben werden, sie können nur in einer Unterklasse versteckt werden.

    
Peter Lawrey 15.12.2010 10:31
quelle
0

Eine häufige Verwendung für Singletons mit verzögerter Initialisierung (alias Meyers-Singletons) besteht darin, die Reihenfolge der Initialisierung statischer Objekte zu steuern (die in C ++ über verschiedene Übersetzungseinheiten hinweg nicht definiert ist). In dieser Hinsicht verhalten sich Singletons einfach wie globale Objekte, aber deren Reihenfolge der Konstruktion verhält sich gut.

Es wird jedoch ziemlich schwierig, die Reihenfolge der Zerstörung zu kontrollieren. Wenn Sie sich darauf verlassen müssen, dass die Singletons in einer bestimmten Reihenfolge zerstört werden (z. B. eine Singleton-Protokollierungsklasse, die andere Singleton-Instanzen überdauern sollte), sehen Sie sich Alexandrescus Buch an, um die Schwierigkeit zu sehen.

    
Alexandre C. 15.12.2010 17:55
quelle
0

Der Hauptzweck für Singletons, die von GoF zitiert werden, ist die Bereitstellung eines polymorphen Dienstes, in dem der Singleton enthalten ist ist eine abstrakte Basisklasse und der konkrete Typ wird zur Laufzeit festgelegt. Und natürlich darf nur einer von ihnen im Programm sein.

    
Marcelo Cantos 15.12.2010 08:35
quelle

Tags und Links