java - wann - Warum ein Singleton anstelle von statischen Methoden verwenden?




wann benutzt man static java (5)

Ein Singleton wird verwendet, um einer Anwendung eine Art globalen Status hinzuzufügen. Wenn es zustandslos ist, sehe ich auch nicht den Sinn eines Singletons, es sei denn

  • Sie erwarten, dass es in absehbarer Zeit mit Staat verlängert wird oder
  • Sie benötigen eine Objektinstanz aus einem bestimmten technischen Grund (z. B. für die C # lock Anweisung, obwohl dies bereits ziemlich weit hergeholt ist) oder
  • Sie brauchen Vererbung, dh Sie möchten Ihren Singleton leicht durch einen anderen ersetzen, der dieselbe Schnittstelle aber eine andere Implementierung verwendet. Zum Beispiel gibt die Methode Toolkit.getDefaultToolkit() in Java ein Singleton zurück, dessen exakter Typ systemabhängig ist.

https://code.i-harness.com

Ich habe nie gute Antworten auf diese einfachen Fragen zu Hilfs- / Hilfsklassen gefunden:

Warum sollte ich einen Singleton (statusless) anstelle von statischen Methoden erstellen?

Warum sollte eine Objektinstanz benötigt werden, wenn ein Objekt keinen Status hat?


Es gibt einen Kompromiss zwischen der Verwendung welcher. Singletons können oder dürfen keinen Zustand haben und sie beziehen sich auf Objekte. Wenn sie nicht den Status beibehalten und nur für den globalen Zugriff verwendet werden, ist statisch besser, da diese Methoden schneller sind. Wenn Sie jedoch Objekte und OOP-Konzepte (Vererbungspolymorphismus) verwenden möchten, ist Singleton besser.

Betrachten Sie ein Beispiel: java.lang.Runtime ist eine Singleton-Klasse in Java. Diese Klasse ermöglicht verschiedene Implementierungen für jede JVM. Die Implementierung ist einmalig pro JVM. Wenn diese Klasse statisch gewesen wäre, können wir nicht verschiedene Implementierungen basierend auf JVM übergeben.

Ich fand diesen Link sehr hilfreich: http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html ?

Ich hoffe es hilft!!


Ich könnte einen Fall für ein Stateless Singleton anstelle einer statischen Methoden-Klasse, nämlich für Dependency Injection sehen .

Wenn Sie eine Hilfsklasse von Dienstprogrammfunktionen verwenden, die Sie direkt verwenden, wird eine verborgene Abhängigkeit erstellt. Sie haben keine Kontrolle darüber, wer sie verwenden kann oder wo. Wenn Sie dieselbe Helper-Klasse über eine statusfreie Singleton-Instanz einbinden, können Sie steuern, wo und wie sie verwendet wird, und sie bei Bedarf ersetzen / vortäuschen.

Wenn Sie es zu einer Singleton-Instanz machen, stellen Sie einfach sicher, dass Sie keine weiteren Objekte des Typs als nötig zuweisen (da Sie immer nur eine benötigen).


In den meisten Programmiersprachen entziehen sich viele Klassen dem Typsystem. Während eine Klasse mit ihren statischen Methoden und Variablen ein Objekt ist, kann sie sehr oft keine Schnittstelle implementieren oder andere Klassen erweitern. Aus diesem Grund kann es nicht in einer polymorphen Weise verwendet werden, da es nicht der Untertyp eines anderen Typs sein kann. Wenn Sie beispielsweise eine Schnittstelle IFooable haben, die von mehreren Methodensignaturen anderer Klassen benötigt wird, kann das Klassenobjekt StaticFoo nicht anstelle von IFooable , während FooSingleton.getInstance() (vorausgesetzt, FooSingleton implementiert IFooable ) verwendet werden kann.

Bitte beachten Sie, dass ein Singleton, wie ich zu Heinzis Antwort kommentierte, ein Muster zur Steuerung der Instanziierung ist. Es ersetzt die new Class() durch Class.getInstance() , wodurch der Autor der Class mehr Kontrolle über Instanzen erhält, mit denen er die Erstellung unnötiger Instanzen verhindern kann. Das Singleton ist nur ein sehr spezieller Fall des Fabrikmusters und sollte als solches behandelt werden. Die allgemeine Verwendung macht es eher zum Sonderfall globaler Registrierungen, was oft schlecht endet, weil globale Registrys nicht einfach nur nutzlos verwendet werden sollten.

Wenn Sie globale Hilfsfunktionen bereitstellen möchten, funktionieren statische Methoden problemlos. Die Klasse wird nicht als Klasse, sondern nur als Namespace fungieren. Ich schlage vor, Sie bewahren hohe Kohäsion, oder Sie könnten mit seltsamsten Kopplungsprobleme enden.

Greetz
zurück2dos


Tatsächlich habe ich eine andere Antwort gefunden, die hier nicht erwähnt wird: statische Methoden sind schwieriger zu testen.

Es scheint, dass die meisten Test-Frameworks großartig sind, um Instanz-Methoden zu verspotten, aber viele von ihnen behandeln nicht auf anständige Weise das Mock-Verfahren von statischen Methoden.





singleton