1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

[Diskussion] Singleton - Vor- und Nachteile

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von ko5tik, 11.04.2011.

  1. ko5tik, 11.04.2011 #1
    ko5tik

    ko5tik Threadstarter Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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 )
     
  2. garak, 11.04.2011 #2
    garak

    garak Ehrenmitglied

    Beiträge:
    8,270
    Erhaltene Danke:
    4,795
    Registriert seit:
    12.12.2009
    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.
     
  3. ko5tik, 11.04.2011 #3
    ko5tik

    ko5tik Threadstarter Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Es ist sehr problematisch, aber machmal nutzlich - und mit Vorsicht zu geniesen
    (Und Josh Bloch neigt zu Esoterik was Java angeht ;) )
     
  4. themerx, 11.04.2011 #4
    themerx

    themerx Neuer Benutzer

    Beiträge:
    16
    Erhaltene Danke:
    0
    Registriert seit:
    09.02.2011
    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.
     
  5. ko5tik, 11.04.2011 #5
    ko5tik

    ko5tik Threadstarter Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
  6. garak, 11.04.2011 #6
    garak

    garak Ehrenmitglied

    Beiträge:
    8,270
    Erhaltene Danke:
    4,795
    Registriert seit:
    12.12.2009
    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.
     
  7. DieGoldeneMitte, 11.04.2011 #7
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    (Singletons sind im Normalfall kein Problem)[​IMG]
     
  8. ko5tik, 11.04.2011 #8
    ko5tik

    ko5tik Threadstarter Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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
     
  9. DieGoldeneMitte, 12.04.2011 #9
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Das würde ich nicht als Argument gegen Singletons sondern eher als Argument gegen JBoss nehmen. :D
     
  10. ko5tik, 12.04.2011 #10
    ko5tik

    ko5tik Threadstarter Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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 )
     
  11. garak, 12.04.2011 #11
    garak

    garak Ehrenmitglied

    Beiträge:
    8,270
    Erhaltene Danke:
    4,795
    Registriert seit:
    12.12.2009
    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.
     
  12. ko5tik, 12.04.2011 #12
    ko5tik

    ko5tik Threadstarter Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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
     
  13. themerx, 13.04.2011 #13
    themerx

    themerx Neuer Benutzer

    Beiträge:
    16
    Erhaltene Danke:
    0
    Registriert seit:
    09.02.2011
    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.
     
  14. funcoder, 13.04.2011 #14
    funcoder

    funcoder Erfahrener Benutzer

    Beiträge:
    218
    Erhaltene Danke:
    38
    Registriert seit:
    15.08.2009
    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.
     
  15. ko5tik, 14.04.2011 #15
    ko5tik

    ko5tik Threadstarter Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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).
    ----%<--------------
     
  16. HectorSavage, 14.04.2011 #16
    HectorSavage

    HectorSavage Junior Mitglied

    Beiträge:
    37
    Erhaltene Danke:
    0
    Registriert seit:
    11.09.2009

    welche andere möglichkeiten gibt es in android daten zwischen zwei threads(model-view) auszutauschen ohne diese in nem singleton zwischenzuspeichern?
     
  17. DieGoldeneMitte, 14.04.2011 #17
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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.
     
  18. garak, 15.04.2011 #18
    garak

    garak Ehrenmitglied

    Beiträge:
    8,270
    Erhaltene Danke:
    4,795
    Registriert seit:
    12.12.2009
    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.
     
  19. ko5tik, 15.04.2011 #19
    ko5tik

    ko5tik Threadstarter Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Kann es sein das du den Prozess und Thread durcheinander bringst?
     
  20. garak, 15.04.2011 #20
    garak

    garak Ehrenmitglied

    Beiträge:
    8,270
    Erhaltene Danke:
    4,795
    Registriert seit:
    12.12.2009
    Ich präzisiere: leichtgewichtige Prozesse.
     

Diese Seite empfehlen