Verwendung von Singletons für zentrale, gewichtige Klassen?

DarthShader

Erfahrenes Mitglied
Hallo zusammen,

ich würde von Euch gerne einmal Eure Meinung zur Verwendung von Singletons hören. Zur Zeit arbeite ich an einem etwas größerem Projekt, und wie es bei vielen Programmen der Fall ist, gibt es einige sehr zentrale (Controller-) Klasse (sowas wie GuiSystem, ApplicationController, ProjectExplorer etc...).

Oft ist es so, dass verschiedene Programmteile Zugriff auf diese zentralen Klassen benötigen. Die Lösung ist für mich momentan, dass ich diese Klassen als Singletons aufbaue, sodass ich von überall aus per ....getInstance() darauf zugreifen kann.

Ich frage mich jedoch gerade - ist das schlechter Stil? Sollte ich eher den Teilen des Programmes eine spezielle Klasse als Parameter mitgeben? So könnte Klasse B die Klasse A benötigen, deshalb gebe ich B eine Instanz von A im Konstruktor mit. Verfahre ich so, hat nur diejenige Klasse Zugriff auf eine andere, die sie wirklich benötigt. Wenn ich Singletons und die .getInstance() Geschichte verwende, könnte quasi jede Klasse auf diese zentralen Klassen zugreifen, was bei mir ein etwas "schlechte Gewissen" aufkommen lässt.


Was sagt ihr dazu, kann man ruhig Singletons verwenden, wenn es sich um wenige, sehr zentrale Klassen handelt, die an vielen Stellen gebraucht werden? Oder sollte man das Programm so auslegen, dass Singletons besser vermieden werden können?


Bin gespannt auf Eure Meinungen

Danke!
 
Hallo,

Oft ist es so, dass verschiedene Programmteile Zugriff auf diese zentralen Klassen benötigen. Die Lösung ist für mich momentan, dass ich diese Klassen als Singletons aufbaue, sodass ich von überall aus per ....getInstance() darauf zugreifen kann.

Ich denke "handmade" Singletons sollte man eher nicht verwenden, da sie das testen der Anwendung erschweren.

Ich bevorzuge es meine Anwendungen in kleine Komponenten / Services zu zerlegen, die ich dann per Spring über Dependency Injection zusammen stöpsle.

Das machts dann einfacher Komponenten zu testen und auszutauschen.

Über Spring kann ich dann auch steuern (über den Scope), ob ich ein bestimmtes Konstrukt nur als Singleton oder doch als Prototype haben möchte. Weiterhin ist es auch möglich eigene Scopes (Sichtbarkeits Bereiche) zu definieren, innerhalb dessen eine Instanz verwendet wird. So könnte man beispielsweise auch einen UseCase / Process Scope definieren der eine Instanz für die Verwendung innerhalb eines Prozesses beim starten erzeugt und beim beenden wieder vernichtet.

Gruß Tom
 
Hallo,

Ich bevorzuge es meine Anwendungen in kleine Komponenten / Services zu zerlegen, die ich dann per Spring über Dependency Injection zusammen stöpsle.

Das machts dann einfacher Komponenten zu testen und auszutauschen.

Das klingt sehr interessant, Spring habe ich bisher noch nicht verwendet. Hast Du da ein Tutorial o.Ä. zur Hand, was genau diesen Dependency Injection beschreibt? Möglicherweise hast Du auch ein kleinen Beispielcode, der das verdeutlicht?

Vielen Dank!
 

Neue Beiträge

Zurück