[Diskussion] Singleton - Vor- und Nachteile

K

ko5tik

Stammgast
41
Singleton ist an sich Problematisch (aber manchmal nutzlich). Saubere Lösung wäre die Verwendung eines Dependency Injection Framework ( wie zum Beispiel RoboGuice oder Spring - aber Spring ist ziemlich schwer für Android )
 
Das einzig unelegante daran ist die Instantiierung, die eigentlich so aussehen sollte:
Code:
[COLOR=Black][COLOR=#000000][COLOR=#007700]private static [/COLOR][COLOR=#0000bb]Helper instance [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]new Helper()[/COLOR][COLOR=#007700];[/COLOR][/COLOR][/COLOR]
Und ansonsten ist singleton nicht problematisch, sondern wird von Joshua Bloch sogar empfohlen, gerade im Bezug auf die Parametrisierung von Klassen.
 
Es ist sehr problematisch, aber machmal nutzlich - und mit Vorsicht zu geniesen
(Und Josh Bloch neigt zu Esoterik was Java angeht ;) )
 
Ich verstehe nicht, was daran problematisch sein soll. Die Instanziierung ist auch nicht problematisch, weil man die bei der Rückgabe der eigenen Instanz (sieh mein Beispiel) einmalig ausführen kann.
Im Allgemeinen finde ich Singletons schon sehr nütlich und praktisch, vor allem wenn es um Ressourcen geht.
 
Lieber einen zur Esoterik neigenden Java-Spezialisten, der die Möglichkeiten der Programmiersprache aufzeigt, als jemand wie dich, der vehement versucht seine Sicht der Dinge als die einzig wahre - untermauert durch witzige Google-Suchmaschinenlinks - darzustellen. Verzeih mir wenn ich das jetzt etwas überspitzt darstelle (machst du mit der Esoterik-Bemerkung nicht anders), jedoch kann ich Fanatismus - auch nur ansatzweise - überhaupt nicht ausstehen. Es gibt in jeder Programmiersprache Konstrukte, die falsch angewendet zur großen Katastrophe führen. Beispielsweise Zeiger in C. Aber wollte man ohne sie leben? Ich bezweifele, dass es überhaupt geht. Und deswegen kann ich auch nicht so ganz nachvollziehen wieso du hier so eine Front gegen Singletons aufmachst. Sie sind manchmal des Beste wenn nicht sogar das einzige Mittel bestimmte Probleme zu lösen und gut ist. Es sei denn du zeigst Alternativen auf. Dann freue ich mich auf eine spannende Diskussion, denn ich lerne gerne etwas neues hinzu.
 
(Singletons sind im Normalfall kein Problem)
6a00d8341d3df553ef0147e0761e2f970b-800wi

 
Manchmal ist es noch lüstiger - Wenn zum Beispiel 2 Web-Contexte gleichen SIngleton haben
( passiert manchmal in JBoss dank der Unified-Classloadern oder Parent-First ) - das fängt man an in der Produktionumgebung nach dem Race-Conditions zu jagen. Und ihr sitzt ohne Internetzugang

Deswegen: Finger weg von SIngleton, es sei denn du weiß ganz genau was du tust
 
ko5tik schrieb:
Manchmal ist es noch lüstiger - Wenn zum Beispiel 2 Web-Contexte gleichen SIngleton haben
( passiert manchmal in JBoss dank der Unified-Classloadern oder Parent-First ) - das fängt man an in der Produktionumgebung nach dem Race-Conditions zu jagen.

Das würde ich nicht als Argument gegen Singletons sondern eher als Argument gegen JBoss nehmen. :D
 
Die anderen App-Server sind nicht unbedingt besser - und ein Singleton in einer Library ist immer gefährlich. ( Abgesehen von bekannten Problemen mit testen, einsickern von Implementierungdetails,
engen Verknupfungen usw )
 
ko5tik schrieb:
ein Singleton in einer Library ist immer gefährlich

Gut, wir haben jetzt alle (hoffentlich) gelernt, Singletons sind böse und man sollte immer große Mengen Knoblauch und ein bis zwei Kreuze um seinen Computer legen, damit so ein böses Singleton keinen Schaden anrichten kann.

Aber erkläre uns doch mal bitte, wie würdest du eine globale Klasse realisieren, nennen wir sie mal Middleware, über die verschiedene Prozesse auf dem Client mit einem Server kommunizieren? Dabei darf die Klasse nur einmal existieren und es darf auch nur eine Verbindung zum Server bestehen.
 
Wenn es um Verschieden Prozesse geht, dann sind es verschiedene JVMs - also Beispiel irrelewant.
In einen Applikationsserver registriert man ein solches Connector typischerweise im JNDI ( Beispiel: DataSource / JCA Adapter) - dann können mehrere auf dem Server deployte Anwendungen darauf zugreifen.
Etwas moderner sind die DI-Frameworks, aber diese greifen eher innerhalb einer Anwendung.

... wer aber in einen Serveranwendung eigene Datenbankverbindungen (oder ähnliches) direkt aufmacht wird von Operating-Abteililung und Datenbankadmins mishandelt
 
Wie ich sehe, wurde das Thema jetzt zu einem eigenen Post abgespalten.

@Ko5tik
Singletons in Applikationsserver ist ja schon recht speziell. Habe ich nie gemacht und da kann ich auch nicht mitreden, jedoch geht es hier nicht um Applikationsserver sondern um Singleton.
Ich programmiere Games und dort nutze ich Singletons z.B. für die Soundverwaltung. Ein Singleton, welche die Sounds aufnimmt und Befehle zum Abspielen, Stoppen, usw. hat.
Oder generelle Szenenverwaltung handle ich genauso und ich habe bis jetzt noch nie Probleme gehabt. Im Gegenteil, es hat mir viel Arbeit abgenommen und man muss keine Objektreferenzen über Parameter hin und her schieben.
Wo ist also das Problem bzw. das Böse?

MFG T.
 
Vorausgesetzt man setzt Singletons sinnvoll ein und missbraucht diese nicht als globalen Datenspeicher, gibt es genügend Anwendungsgebiete wo Singletons dem Entwickler die Arbeit erleichtert.

Der einzige wirkliche Nachteil der mir zu dem Thema einfällt ist, dass ich keine wirkliche Zugriffskontrolle auf das Objekt durch die globale Verfügbarkeit besitze.
Für mich kein wirkliches Problem eher eine kleine Designschwäche.
 
Kam gerade per twitter von dem Chefarchitekt von twitter als retweet :
-----%<-------------
All I am saying is, if I see another mutable singleton in this code, someone's getting blood-eagled (look it up: Blood eagle - Wikipedia, the free encyclopedia).
----%<--------------
 
funcoder schrieb:
Vorausgesetzt man setzt Singletons sinnvoll ein und missbraucht diese nicht als globalen Datenspeicher, gibt es genügend Anwendungsgebiete wo Singletons dem Entwickler die Arbeit erleichtert.


welche andere möglichkeiten gibt es in android daten zwischen zwei threads(model-view) auszutauschen ohne diese in nem singleton zwischenzuspeichern?
 
HectorSavage schrieb:
welche andere möglichkeiten gibt es in android daten zwischen zwei threads(model-view) auszutauschen ohne diese in nem singleton zwischenzuspeichern?

Kann es sein, dass du von der Notwendigkeit von Semaphoren redest? :D

Für Daten von zwei Threads reicht ein gemeinsamer "Context" aus. Oder man macht direkt Messagepassing. Und wenn ich nachdenke, fällt mir sicher noch mehr ein.
 
ko5tik schrieb:
Wenn es um Verschieden Prozesse geht, dann sind es verschiedene JVMs - also Beispiel irrelewant.
In einen Applikationsserver
Es geht hier weder um verschiedene JVMs noch um einen Server. Ich habe ganz deutlich geschrieben, dass es sich um einen Client mit mehreren Prozessen handelt. Und ich warte immer noch auf eine sinnvolle Erklärung deinerseits, dieses Problem ohne Singletons zu lösen. Aber offensichtlich kannst du das nicht und deshalb zündest du hier Nebelkerzen und redest wirres Zeug, damit du deine These, dass Singletons böse und vollkommen überflüssig sind, aufrecht erhalten kannst. Schade, denn ich hatte mich auf eine konstruktive Diskussion gefreut.
 
Kann es sein das du den Prozess und Thread durcheinander bringst?
 
Ich präzisiere: leichtgewichtige Prozesse.
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
116
swa00
swa00
Laser5001
Antworten
3
Aufrufe
646
swa00
swa00
H
  • HerrFatalVonError
Antworten
4
Aufrufe
787
jogimuc
J
Zurück
Oben Unten