Singleton Entwurfsmuster

Sekundentakt

Bekanntes Mitglied
Hallo,

hier mal ein Singleton-Codeschnipsel von wikipedia.

Java:
  public final class Singleton {
 
      /**
       * Privates Klassenattribut,
       * wird beim erstmaligen Gebrauch (nicht beim Laden) der Klasse erzeugt
       */
      private static Singleton instance;
 
      /** Konstruktor ist privat, Klasse darf nicht von außen instanziiert werden. */
      private Singleton() {}
 
      /**
       * Statische Methode „getInstance()“ liefert die einzige Instanz der Klasse zurück.
       * Ist synchronisiert und somit thread-sicher.
       */
      public synchronized static Singleton getInstance() {
          if (instance == null) {
              instance = new Singleton();
          }
          return instance;
      }
  }

Dieser Singleton hat den Nachteil, dass die getInstance()-Methode synchronisiert wird. Bei nebenläufigen Anwendungen, die alle auf den Singleton zugreifen wollen, könnte es daher zu Performanceproblemen kommen.

Schafft das hier Abhilfe?

Java:
  public final class Singleton {
 
      /**
       * Privates Klassenattribut,
       * wird beim erstmaligen Gebrauch (nicht beim Laden) der Klasse erzeugt
       */
      private static Singleton instance;
 
      /** Konstruktor ist privat, Klasse darf nicht von außen instanziiert werden. */
      private Singleton() {}
 
      /**
       * Statische Methode „getInstance()“ liefert die einzige Instanz der Klasse zurück.
       * Ist synchronisiert und somit thread-sicher.
       */
      public static Singleton getInstance() {
          if (instance == null) {
              instance = createNewInstance();
          }
          return instance;
      }

      public synchronized static Singleton createNewInstance()
      {
            return new Singleton();
      }
  }

Beste Grüße
 

Niki

Top Contributor
dadurch ist nicht sicher gestellt dass tatsächlich nur ein objekt existiert, da die abfrage, ob instance null ist, nicht synchronisiert ist. das heißt es könnte, während das objekt erstellt wird, ein zweiter thread vor der synchronisierten methode warten

//eventuell wär das schlauer:
Java:
private static final Singleton = new Singleton();
 
M

maki

Gast
Schafft das hier Abhilfe?
Nein.

Frage: Wozu eigentlich die Lazy-Init?
Warum nciht einfach:
Java:
private static Singleton instance = new Singleton();
.. und nun wieder zum üblichen Tenor: Singletons schaffen starke Kopplung zwischen den Klassen und sollten im allgemeinen vermieden werden.
 

Sekundentakt

Bekanntes Mitglied
Okay, vielleicht erst mal zu mir:
Ich bin gerade dabei ein etwas umfangreicheres Projekt im privaten Rahmen zu realisieren.
Dieses Projekt soll mein Einstieg in JavaEE werden.

Folgendes habe ich mir gedacht:
Ich habe mehrere Schichten in meiner Anwendung:

Die Kommunikationsschicht (Servlet, Server-Klasse).
Die Applikationsschicht, welche sich wiederum in kleinere Schichten unterteilen lässt.

Die Applikationsschicht wird dabei für die Kommunikationsschicht als ein einziges Objekt dargestellt, das MyApplicationContainer-Objekt.
Um den Begriff etwas aufzuschlüsseln: Ich nenne es Container, weil es die gesamte Applikation enthält.
Falls ich mich eines Tages dazu entscheide, die JavaEE-Anwendung, welche derzeit über Servlets arbeiten soll, in einer Desktop-Umgebung einzusetzen, brauche ich nur das Container-Objekt richtig zu initialisieren und habe sofort sämtliche Möglichkeiten meiner Anwendung in eine Desktop-Anwendung eingebettet.

Dieser ApplicationContainer soll einige Objekte enthalten, die wirklich nur einmalig auftauchen dürfen.
Das sind mehrere DataAccesObjekte, VerificationHandler, RequestHandler und ResponseWriter, aber auch bestimmte Caches.

Ich brauche jedes dieser Objekte tatsächlich nur ein einziges mal, da sie einen bestimmten logischen Bereich der Anwendung kapseln. Welche das sind, sagen die obigen Namen ja schon.

Ich könnte jedes dieser Objekte im Konstruktor des MyApplicationContainers erstellen. Dann kann ich mir sicher sein, dass es nur ein einziges mal existiert.
Ich habe an anderer Stelle in diesem Forum aber den Hinweis bekommen, dass ich das via Singleton-Entwurfsmuster realisieren soll.

Denke ich hier vielleicht zu kompliziert?

Danke!
 
M

maki

Gast
Denke ich hier vielleicht zu kompliziert?
Ja :)

Nur weil Objekte von bestimmten Klassen nur einmal brauchst, muss man sie ja nicht so verhunzen (SCNR), einmal instanziieren reicht doch auch.
Dir geht es wohl eher um den Zugriff über getInstance(), und genau hier beginnen die Probleme: globale Variablen, abhängigkeiten zu statischen Methoden... JEE bietet hierfür bessere Methoden, mit oder ohne Spring.

Nebenbei, warum nicht an den offiziellen JEE Bezeichnungen für Schichten Orientieren?
Servlets gehören in die Presentationtier, nicht in die "kommunikationsschicht" (?), wenn du schon einsteigst in JEE, dann doch bitte auf der richtigen Seite :)
 

Sekundentakt

Bekanntes Mitglied
Servlets gehören in die Presentationtier, nicht in die "kommunikationsschicht" (?), wenn du schon einsteigst in JEE, dann doch bitte auf der richtigen Seite
So langsam kriege ich das Gefühl, dass das Buch, welches ich dazu lese, Müll ist...

Dir geht es wohl eher um den Zugriff über getInstance(), und genau hier beginnen die Probleme: globale Variablen, abhängigkeiten zu statischen Methoden... JEE bietet hierfür bessere Methoden, mit oder ohne Spring.
Mir ging es darum, dass ich sicherstellen will, dass der GC das Objekt nicht killt, obwohl es noch gebraucht wird.
Eigentlich *sollte* das nicht passieren, aber auf irgendeiner Seite wurde mal so etwas suggeriert.

Btw: Gibt's irgendetwas an der Architektur zu kritisieren? :)
 

Sekundentakt

Bekanntes Mitglied
Solange es referenziert wird kann es nciht "gekillt" werden.
Gut, ich dachte diese Wahrheit wäre irgendwo im JavaEE-Standard umgeschrieben worden.

BEstimmt, wenn du konkreter wirst mit deinen Beschreibungen
Es wäre toll, wenn Du die ein oder andere Frage anbieten könntest, denn ansonsten würde ich Dir hier eine mehrseitige Beschreibung präsentieren. Ich weiß nicht, ob das in Deinem Sinne wäre :).
 
M

maki

Gast
Architektur sollte immer schnell beschrieben werden können, geht ja nicht um Details, ganz grob eben, aus der Vogelperspektive.)
Design kann schon detailierter sein, sollte aber keine Implementierungsdetails enthalten :)

Fragen:
Du nutzt ja DAOs, wo werden diese aufgerufen? -> Hoffentlich nicht in Servlets.
Wo steckt denn die Fachlogik der Anwendung? -> s.o.

Klassiche Architektur mit J(2)EE:
Servlets (Das C in MVC) -> EJBs (enthalten Fachlogik) -> DAOs -> DB

Servlet gehören zur Presentation Tier, EJBs zur Busniess Tier, DAOs zur Integration Tier.
 

Sekundentakt

Bekanntes Mitglied
Die Anwendung lässt sich so beschreiben:

- Servlet / Server / Desktopumgebung (Wer auch immer den Request entgegennimmt und im richtigen Format an die eigentliche Anwendung weitergibt)
- Anwendung
--- DAOs die auf DBs bzw. Dateien basieren

Also:
Servlet -> Anwendung -> DAOs -> DB/Datei

Frage:
Müssen sich EJBs an irgendetwas halten? Oder kann ich da wie ich lustig bin programmieren?

Das Servlet würde die Anwendung z.B. in Form einer Variable an sich binden.
Eine Desktop-Umgebung würde das an geeigneter Stelle ebenso tun.

EDIT;
Im Moment entwerfe ich Klassen für verschiedene Aufgaben (DAOs, VerifikationsHandler, RequestHandler, etc.).
Die gesamte Logik soll sich dann im ApplicationContainer treffen (Request entgegennehmen, verifizieren, bearbeiten, ausführen, Ergebnis erstellen).

Ziel ist es, wie auch schon angedeutet, dass ich die gesamte Anwendung und all ihre Fähigkeiten in ein neues Projekt einbringen kann, ohne dem verantwortlichen Entwickler die Komplexität aller Schichten aufzuzwingen.

Wikipedia meint zu EJBs aber etwas, was irgendwie nicht zu meiner Beschreibung des ApplicationContainers passt.
 
Zuletzt bearbeitet:
M

maki

Gast
EJB2.x müssen sehr viel einhalten, EJB3.x nicht ganz soviel, ist aber nicht mal so auf die schnelle erklärt :)

Dein Anwendungsschicht besteht auf Services nehme ich an, welche von den Servlets bzw. Desktop Client verwendet werden, ja?
 

Sekundentakt

Bekanntes Mitglied
Ich hab' das Ganze gerade eben noch etwas ergänzt.

Dein Anwendungsschicht besteht auf Services nehme ich an, welche von den Servlets bzw. Desktop Client verwendet werden, ja?
Exakt.
Allerdings möchte ich dabei wie gesagt nicht voraussetzen, das meine Anwendung auf irgendeinem Server liegt, der via HTTP oder Ähnlichem angesprochen werden muss.
Ich möchte auch, dass man die Anwendung ganz einfach als Objekt in eine andere Anwendung einbetten kann.
 
M

maki

Gast
Vielleciht wäre SPring eher etwas für dich, spart dir auch die Singletons, ist imho flexibler weil universeller (obwohl EJB auch ganz schön leichtgewichtig sein kann), Spring ist läuft eben überall, von Desktop, WebApp, OSGi, Eclipse RCP bis hin zu JEE :)

Allerdings ist Dependency Injection eine andere Art des Design (lose gekoppelte Komponenten - ja, Bullshit Bingo *G*), lohnt sich auf jedenfall DI zu erlernen, speziell weil EJB3 das auch hat und sehr gut zu deinen Anforderungen passt.
 

Sekundentakt

Bekanntes Mitglied
Danke für die Tipps :).

Ich frage mal anders: Wenn ich all das *nicht* nutze, muss ich mir dann Gedanken darum machen, dass die Software *nicht* funktioniert?

Ich bin ein bisschen darauf angewiesen, dass das was ich gerade mache am Tag X funktioniert. Es muss nicht perfekt sein, aber funktionieren. Es geht dabei um eine Präsentation, bei der ich gerne ein paar Algorithmen vorstellen würde und die ausführende Anwendung muss hier zwingend via Servlet erreichbar sein.
Falls das was Du aufgezählt hast zwingend Pflicht ist, damit die Servlet-Anwendung läuft, seh ich da nämlich schwarz :).

Gruß
 
M

maki

Gast
Pflicht ist es nciht, und wenn du einen Termin hast, dann geht es auch ohne (bzw. das würdest du schon merken), für Termine (vor allem Präsentationen) kannst du auch die Singletons drinnlassen.
 

Sekundentakt

Bekanntes Mitglied
Ich bin zum Glück in der tollen Situation, dass ich die Singletons noch nicht mal implementiert hatte ;).

Es werden jetzt ganz normale Objekte, die im Konstruktor initialisiert werden.

Allerdings bin ich froh, dass ich vorher hier nachgefragt habe und nicht alles auf Singleton umgestellt habe. :)
 

Landei

Top Contributor
Warum sollte man ein Singleton so schreiben wie oben? Wenn man wirklich eins haben will, geht es so am besten:

Java:
enum Singleton {
  INSTANCE;
  ...
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
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
S singleton vs. static Allgemeine Java-Themen 7
P Singleton vs static Allgemeine Java-Themen 19
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
U Welches ist das richtige Entwurfsmuster Allgemeine Java-Themen 2
L Gutes Entwurfsmuster Buch Allgemeine Java-Themen 1
M Model View Controller Entwurfsmuster! Allgemeine Java-Themen 11
M Entwurfsmuster MVC Allgemeine Java-Themen 2
S Entwurfsmuster Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben