Wie kann man das verstehen, dass das Feld instanz von der "Art" Singelton ist. private besagt, dass das Feld nicht öffentlich ist, static, dass es nicht an die Instanziierung eines Objektes gebunden ist, aber wozu dann noch Singelton vor dem Feldnamen?
Weil die Methode getInstanz() ein Objekt des Typs Singleton zurückliefert ist es naheliegend, dass das Feld instanz auch vom Typ (nicht Art) Singleton sein muss.
Du solltest wissen, dass inzwischen viele Leute das Singleton-Pattern kritisch sehen, oder sogar von einem Anti-Pattern reden. Hier eine der ausführlicheren Kritiken: singleton-considered-stupid - steveyegge2
So ein Code muss immer synchronisiert werden. Damit du dir das aber erspaarst kannst du einen static constructor anlegen und in dem die Variable setzen.
Davon abgesehen das ich Landei und maki natürlich zustimme, das GoF Singleton ist ein Anti-Pattern, ist mir unbegreiflich warum jeder immer meint besonders clever sein müssen mit 'Lazy-Init'.
Java:
if(instanz ==null)
instanz =newSingelton();
Es gibt fast keinen Fall wo dieser Code Vorteile bringt. In allen anderen Fällen führt es zu Problemen mit Threads, führt unnötige Codezeilen ein, INSTANCE kann nicht mehr final sein und dann ist auch noch etwas langsamer. :autsch:
Leider bekomme ich das auch meinen Kollegen nicht eingeimpft.
Auf aktuellen JVMs wird die Initialisierung in dem Fall sogar lazy ausgeführt. Klassen werden erst initialisiert wenn das erste mal eine Methode davon aufgerufen wird. Um die synchronization braucht man sich dann auch keine Sorgen machen, die JVM kümmert sich da schon drum.
ich habe vor gar nicht allzu langer Zeit auch mal etwas über das Singleton Entwurfsmuster auf meinem Blog geschrieben.
Vielleicht klärt das noch offene Fragen.
2) Seit Java 1.5 der bevorzugte Stil: Man benutzt ein [c]enum[/c].
Java:
publicenumFoo{
INSTANCE;}
Achtung, zusätzliche Vorkehrungen sind notwendig, wenn die Singletons serialisiert werden müssen!
Man sieht oft wilde Implementierungen, die mit synchronized und dem double-checked locking pattern herumhantieren, aber sie sind nicht nur komplizierter, sondern schlicht unbrauchbar: The "Double-Checked Locking is Broken" Declaration
Was dabei oft missverstanden wird, die einfache Variante das Feld direkt zu initialisieren ist auch fast immer Lazy Loading, weil die Variable erst dann initialisiert wird wenn die Klasse geladen wird, also wenn sie wirklich gebraucht wird.
Der einzige Fall in dem die Instanz zu früh erstellt werden würde, ist wenn die Klasse, oder statische Methoden der Klasse verwendet werden ohne das auch gleich nach der Singleton Instanz gefragt wird. Und dafür gibt es nun wirklich fast keinen validen Use-Case.
Wirklich jedes DI Framework beschreibt genau das in der Doku.
Ist gar nicht so komplex wie man meint, Singletons stellen externe Abhängkeiten dar, diese werden in DI entweder per Setter, Konstruktor oder Annotationen "injeziert", also als Parameter übergeben.
Die Frage hatte gar nix mit Singletons zu tun. Der Threadsteller fragt einfach nur warum er den Typ vor eine Variable schreiben muss. Ja weil eine Variable halt einen Typ braucht! Man muss ja issen ob instanz eine Zahl, ein Kunde, ein Huhn oder dein Singelton Objekt ist.
Gibt es irgendwo ein Beispiel, wie man mit Dependency Injections Singeltons ersetzen kann?
Wobei jetzt Singleton eine ganz normale POJO wäre und keine static instanz und private Konstrutor braucht. Und ein Bissal Konfig je nach DI Framework noch fehlt
In Guice kann man entweder die zu injizierende Klasse mit [c]@Singleton[/c] annotieren, oder alternativ als Eigenschaft beim Binden angeben. Für die Klasse, die das Ding injiziert bekommt, sieht das Singleton wie jeder andere injizierte Wert aus.
Hallo,
das hier diskutierte Pattern ist veraltet. Die verschiedenen Nachteile sind ja bereits ausführlich diskutiert worden. Seit Java 5 gibt es ein viel robusteres Pattern mit Enums.
Das ist schon alles. Die Vorteile sind: Viel weniger Code, es gibt keine Probleme mit Threads, es ist unter keinen Umständen möglich, dass man aus versehen doch mehrere Instanzen erzeugt, enums sind sogar out of the box serializable.
Man sieht oft wilde Implementierungen, die mit synchronized und dem double-checked locking pattern herumhantieren, aber sie sind nicht nur komplizierter, sondern schlicht unbrauchbar: The "Double-Checked Locking is Broken" Declaration
Ich habe etwas recherchiert und festgestellt, dass JEE6 in der Regel benötigt wird. Was ist nun, wenn ich einfach nur ne Desktop Applikation z.B. in Swing entwickle. Nehme ich da auch ein DI Framework als Ersatz für:
Ich auch, aber in dem Bereich in dem ich arbeite (Web-Backends ^^), sind große Systeme meistens schon auf JEE oder Spring Basis. Dort wird meistens kaum einer auf Guice aufbauen.
Das es auch für größere Dinge wunderbar ist sehe ich an meinem Chatserver, der um Guice herum ein großes Framework aufgebaut hat