singleton vs. static

Status
Nicht offen für weitere Antworten.

Solour

Aktives Mitglied
Hey,

so wie ich das sehe macht die singletonverwendung oft keinen sinn.
Eine klasse die vollständig static ist gibt es ja schließlich auch nur einmal (und das mit 100%iger sicherheit)

  • gibt es außer den folgenden noch gute gründe FÜR singleton?
    [list:a7660fd3ac]
  • abhängig vom classloader wird eine statische klasse evtl. geladen obwohl nicht direkt verwendet. damit sind ressourcennutzungen verbunden. sind diese nutzungen inakzeptabel macht es sinn dies zu verhinden. (z.B. beim laden von bildern etc. durch die klasse) durch singleton-verwendung kann also die ressourcennutzung auf den zeitpunkt verschoben werden zu dem sie benötigt wird. (evtl. werden die ressourcen auch garnicht verwendet, falls die klasse nicht zum einsatz kommt)
  • evtl. sollen während dem programmfluss dann doch mehrere der objekte erzeugt werden. dabei stellt also die singleton-klasse sicher das nur eine gewisse zahl von objekten existieren (auch bekannt als "multiton")
[*]gibt es gute argumente GEGEN singletons? (evtl. irgendwelche spezialfälle?)
[*]warum ist java.lang.Math kein singleton(hab ich jedenfalls grad wo gelesen)?
[*] könnt ihr real-life probleme schildern wo singletons ratsam waren?
[*] ich kann mit vorstellen das man viele situationen nennen kann, wenn das objekt das singleton sein soll aus einer ableitung ensteht. gibt es für sonstige fälle gute beispiele?
[/list:u:a7660fd3ac]

bis dann
Solour

ps: ja den faq entry hab ich gelesen,
ja gesucht hab ich schon,
ja gegoogled auch ;P

pps: gibt es gute links zur dokumentation von classloadern? (interessieren mich eigenelich nur sun/blackdown in versionen 1.4.2 + 1.5)
 
B

Beni

Gast
IMHO haben Singletons gegenüber Klassen bei denen überall ein "static" hingauen wurden, folgende Vorteile:
  • Man kann sie immernoch relativ leicht ersetzen durch andere Klassen
  • Man kann auch Interfaces oder abstrakte Klassen als Singletons verwenden
  • Innerhalb des Singletons kann man normal weiterprogrammieren, insbesondere kann man die "this"-Referenz weiterhin benutzen.

Gegen Singletons spricht dasselbe wie gegen static:
  • Man kann es immer anders lösen (nicht immer einfacher :wink: )
  • Man baut sich was ziemlich unflexibles ins Programm ein. Im vorraus sagen "das gibts nur einmal" - damit kann man gewaltig auf die Nase fliegen
  • Eine Umstellung ist später sehr schwer, komplizierter jedenfalls als gleich zu Beginn auf Singletons zu verzichten

java.lang.Math ist so eine Spezialfall... PI wird sich nie ändern, ebensowenig wie der Sinus jemals eine andere Funktion sein wird. Math muss intern keine Variablen speichern, und die viele Methoden sind nativ implementiert. Anders gefragt: wieso sollte man ein Math-Objekt benötigen? Man benötigt nur die Methoden und Konstanten.

Real-life: ich verzichte weitgehendst auf Singletons und static's, sinnvolle Anwendungen sehe ich hier:
  • Um Ressourcen zu laden, Icons, Bildchen, Plugins, ... und z.B. in einem Cache behalten
  • Als Ober-Super-Kontroller-Objekt, das Ding, welches das Programm startet, und welches auch als einziges das Programm wieder schliessen kann (andere Objekte dürfen höflich nachfragen, selbst aber nichts unternehmen).
  • Vielleicht auch um einen Worker-Thread zu implementieren (ein Thread der ausserhalb des EDT's Dinge berechnet).

Ich würde aber darauf verzichten, etwas Singleton zu machen, nur weil es in der "echten" Welt Singleton ist. Weil der Planet "Erde" nur einmal existiert, sollen wir nur eine Instanz von seinem Model anlegen? Dabei wäre es doch lustig verschiedene Aktionen (Meteorit schlägt ein, Sonne explodiert, Nächste Eiszeit beginnt) an verschiedenen Kopien auszuprobieren :wink:
 
B

bygones

Gast
Solour hat gesagt.:
so wie ich das sehe macht die singletonverwendung oft keinen sinn.
Eine klasse die vollständig static ist gibt es ja schließlich auch nur einmal (und das mit 100%iger sicherheit)
das würde implizieren, dass die Sicherheit bei einem Singleton nicht gegeben ist und das ist falsch !!
 

nEp

Aktives Mitglied
Also ich würde auch sagen, dass man in Java eigentlich immer um Singletons herum kommen sollte. Da gibt es eigentlich immer bessere und v.a. flexiblere Lösungen.
Wie schon weiter oben gesagt, würd ich dass auch, wenn überhaupt, für so Resourcen-Sachen verwenden.

In C++ haben Singletons IMHO schon ein kleines bisschen mehr Sinn. Man könnte z.B. eine Klasse, die direkten Zugriff auf die Tastatur bietet (z.B. bei Spielen) durchaus als Singleton implementieren, da man diese ja eh immer nur genau einmal braucht. Dadurch hätte man diese Klasse als eine art globale Variable definiert und könnte sich die ganzen "extern"-Deklarationen bei jeder neuen Datei ersparen, die diese Klasse verwendet.
Da Java hier aber anders funktioniert, entfällt dieser Case für Java.
 
S

SlaterB

Gast
Singleton-Objekte sind Objekte und keine Klassen!

das ist in manchen Fällen unumgänglich,
wie beim Casten auf Oberklassen (Rückgabetyp einer Operation) oder in der Verwendung als ActionListener/ Einfügen in eine Liste und ähnliches

kann nicht beteuern dass das überhaupt sinnvolle Einsatzzwecke für Singleton/ Klassen sind,
aber technisch geht das eben nur als Objekt ;)
 

Solour

Aktives Mitglied
Hey,

Schonmal vielen dank für die Antworten
  • Man kann sie immernoch relativ leicht ersetzen durch andere Klassen
    Naja warum kann man das nicht auch bei statischen klassen?
  • Man kann auch Interfaces oder abstrakte Klassen als Singletons verwenden
    ja genau. man verbaut sich also praktische diese möglichkeit. gut. :)
  • Innerhalb des Singletons kann man normal weiterprogrammieren, insbesondere kann man die "this"-Referenz weiterhin benutzen.
    man kann doch mit äquivalenter semantik "KlassenName." schreiben. (Mir ist der unterschied schon klar ;)
  • das würde implizieren, dass die Sicherheit bei einem Singleton nicht gegeben ist und das ist falsch !!
    das wäre korrekt, würde da nicht der konjunktiv sein ;). was ich meinte ist das man den singleton dann natürlich korrekt implementieren muss und das scheint mir nach recherche nicht für jeden ganz einfach..(zumindest die multithread/multiprozessor varianten)
  • wie beim Casten auf Oberklassen (Rückgabetyp einer Operation) oder in der Verwendung als ActionListener/ Einfügen in eine Liste und ähnliches
    das meinte ich mit "ich kann mit vorstellen das man viele situationen nennen kann, wenn das objekt das singleton sein soll aus einer ableitung ensteht. gibt es für sonstige fälle gute beispiele?"

mir wäre zwar eine ultimative kategorisierung lieber bei der ich nicht jeweils abwägen und nachdenken müsste aber das geht wohl leider wie so oft nicht.

bis dann
Solour
 

byte

Top Contributor
Ich finde die Tatsache, dass Singletons Objekte sind, schon grund genug nicht static zu arbeiten! Objekte ermöglichen Delegation, Aggregation, Vererbung, Trennung von Konzept und Implementierung (abstract, Interfaces) und so weiter und so fort. Singletons können demnach perfekt in die Objektstruktur eingegliedert werden. Ausserdem kann man sie serialisieren...

Statische Klassen hingegen machen imo nur als Util Klassen Sinn. Also Methoden, die unabhängig von einem Status oder Kontext einfach nur Funktionität bereitstellen sollen, wie z.B. die Methoden aus Math. Eine Methode zur Berechnung der Quadratwurzel beispielsweise, kann Verwendung in jedem möglichen Kontext finden. Es wäre nicht sinnvoll, extra dafür ein Objekt instanzieren zu müssen.
 
B

Beni

Gast
Noch ein paar Bemerkungen zu deinen Antworten:

Man kann sie immernoch relativ leicht ersetzen durch andere Klassen
Naja warum kann man das nicht auch bei statischen klassen?
Dann versuch mal 100 Aufrufe der Form "Blabla.machWas( ... )" im Code zu ersetzen :wink: Oder ersetzt du lieber direkt die statischen Methoden (da geht auch schnell was kaputt)? Und bevor du an ein Delegate denkst (die static-Methoden rufen einfach andere auf), da hilft dir der Compiler immernoch nicht, alles richtig umzuschreiben, oder die Implementation ist wieder ein Singleton.

Innerhalb des Singletons kann man normal weiterprogrammieren, insbesondere kann man die "this"-Referenz weiterhin benutzen.
man kann doch mit äquivalenter semantik "KlassenName." schreiben. (Mir ist der unterschied schon klar ;)
Aber nicht für jedes Problem. Manchmal muss man ja auch einer Methode was übergeben (z.B. ein ActionListener), mit der "alles static"-Variante musst du dir da noch extra ein Objekt anlegen / speichern; beim Singleton könntest du das direkt implementieren.

mir wäre zwar eine ultimative kategorisierung lieber bei der ich nicht jeweils abwägen und nachdenken müsste aber das geht wohl leider wie so oft nicht.
:D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Singleton vs static Allgemeine Java-Themen 19
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
J Singleton Allgemeine Java-Themen 5
Z deserialize singleton Allgemeine Java-Themen 9
A Singleton threadsafe Allgemeine Java-Themen 8
S Singleton Instanz löschen Allgemeine Java-Themen 5
A Datei als Object einlesen und das Object als Singleton instance setzen. Allgemeine Java-Themen 13
T ActionListener und Singleton Allgemeine Java-Themen 15
S Singleton Entwurfsmuster Allgemeine Java-Themen 20
T So eine Art Singleton-Factory? Allgemeine Java-Themen 3
S Singleton-Klasse und ThreadLocal-Klasse von abstrakter Klasse ableiten? Allgemeine Java-Themen 2
S Singleton hier sinnvol? Allgemeine Java-Themen 20
T Zugriff auf Singleton verkürzen - Namespaces?? Allgemeine Java-Themen 20
B Volatile Frage: Reicht es nur den Singleton als volatile zu deklarieren? Allgemeine Java-Themen 4
Iron Monkey Singleton mit Parameter Allgemeine Java-Themen 14
G Singleton Frage: Allgemeine Java-Themen 17
M Singleton und Vererbung? Allgemeine Java-Themen 45
R Wo initilisiere ich eine Liste in einem Singleton? Allgemeine Java-Themen 2
M Java Garbage Collector Frage (Singleton Pattern) Allgemeine Java-Themen 13
B Generisches Singleton implementieren Allgemeine Java-Themen 12
H Singleton und MultiThreading [erledigt] Allgemeine Java-Themen 3
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
P SingleTon Allgemeine Java-Themen 5
M zwei Threads - ein singleton-Objekt Allgemeine Java-Themen 3
RaoulDuke Agent als Singleton Thread Allgemeine Java-Themen 7
K Singleton vererben Allgemeine Java-Themen 15
E Singleton vererben Allgemeine Java-Themen 10
E Frage zu Singleton Allgemeine Java-Themen 22
D Design Pattern: Singleton Allgemeine Java-Themen 4
K Sequenzdiagramm für Singleton-Muster Allgemeine Java-Themen 5
E Methoden abstract static Methode Allgemeine Java-Themen 8
N nicht static und auch nicht new Allgemeine Java-Themen 3
P static Blocks und variablen Allgemeine Java-Themen 41
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
A Variablen non-static variable cannot be referenced from a static content Allgemeine Java-Themen 4
P Static Variable -> unterschiedliche Werte? Allgemeine Java-Themen 1
K Static Variablen verbieten Allgemeine Java-Themen 10
C Generic collections und static typing Allgemeine Java-Themen 4
M Warum nicht static ? Allgemeine Java-Themen 10
M Eine static-Methode verlassen Allgemeine Java-Themen 2
B Schlüsselworte [ERLEDIGT] static { } - Was ist das und wofür kann ich das brauchen? Allgemeine Java-Themen 1
J private static final String variable Allgemeine Java-Themen 8
L Non-static-Variables in Enumerationen Allgemeine Java-Themen 2
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
T Enumeration/Static Final/Bitfield Allgemeine Java-Themen 6
T Static kann nicht verändert werden Allgemeine Java-Themen 3
W Threads Cannot make a static reference.. Allgemeine Java-Themen 13
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
N Static oder andere Lösung Allgemeine Java-Themen 5
N Vererbung Static & private fields - Nicht ganz einfach? Allgemeine Java-Themen 4
M Wo hin mit static factory methods? Allgemeine Java-Themen 40
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
K Static - Problem Allgemeine Java-Themen 10
M Variablen Variablenzugriff aus static void Allgemeine Java-Themen 21
D API - Beispiel + static member in inner (non static) class Allgemeine Java-Themen 2
S static methoden Allgemeine Java-Themen 9
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
X HTTP Problem mit static/non static JTextArea Update Allgemeine Java-Themen 17
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
B static Variable / Unterklasse Allgemeine Java-Themen 2
I Was macht static { ... } ? Allgemeine Java-Themen 8
G static inner Klassen Allgemeine Java-Themen 7
G static und dynamic linking? Allgemeine Java-Themen 32
J in einer static Variable Wert ändern Allgemeine Java-Themen 6
J Verständnisfrage - nested static classes Allgemeine Java-Themen 11
G static- Methoden überschreiben Allgemeine Java-Themen 10
E Geschwindigkeit static Allgemeine Java-Themen 6
V Static oder wie? Allgemeine Java-Themen 61
I reflection get inner static classes Allgemeine Java-Themen 2
L static main - Spezifikation? Allgemeine Java-Themen 7
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
D static Allgemeine Java-Themen 46
P static-Methode aus dem Konstruktor aufrufen Allgemeine Java-Themen 6
oliver1974 "(.) should be accessed in a static way" Falsche W Allgemeine Java-Themen 6
P static Klassenvariable Allgemeine Java-Themen 15
B JPasswordField klassenübergreifend auslesen->static Probl Allgemeine Java-Themen 4
F Methoden: static vs. instance Allgemeine Java-Themen 24
MQue static Methoden/Klassen Allgemeine Java-Themen 7
K Warum static-Methoden nutzen Allgemeine Java-Themen 26
G Java-Befehle Native und Static Allgemeine Java-Themen 2
conan2 static-Block in Klassen Allgemeine Java-Themen 6
M JNI, static.a mit load.Library laden? Allgemeine Java-Themen 2
K Static Members von Superklasse für JEDEN Erben Allgemeine Java-Themen 6
padde479 The static method sleep(long) from the type Thread should. Allgemeine Java-Themen 2
M static-Methode vorschreiben Allgemeine Java-Themen 5
G Object mit static Feldern speichern Allgemeine Java-Themen 9
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4
conan2 "Cannot make a static reference to the non-static field Allgemeine Java-Themen 8
J parameterized und static fields Allgemeine Java-Themen 4
A Static reference to non-static field Allgemeine Java-Themen 10
S static umgehen Allgemeine Java-Themen 5
G static oder nicht Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben