Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe eine Web-Anwendung (Servlets und JSP), in der ich mit einem (bzw. mit dem) Objekt einer Klasse arbeite, die nach Singleton-Muster programmiert ist.
Nun frage ich mich gerade, wie oft es dieses Objekt gibt. Die Servlets laufen ja alle als Threads. Ich brauche pro Thread (also pro Nutzer der Web-Anwendung) eine eigenes Objekt.
Ist die Nutzung des Singleton-Musters hier falsch? Ich tippe mal, dass ich mich vom Singleton an dieser Stelle verabschieden muss...
Wirklich brauchen tut man das Singleton-Musters fast nie. Wenn du mehr als ein Objekt haben willst, ist es natürlich erst recht falsch, denn - wie der Name schon sagt - darf es nur ein Objekt der Singleton-Klasse geben.
Ich finde den Aspekt ganz praktisch, dass man damit ein global verfügbares Objekt hat.
Mein "noch-Singleton"-Objekt dient dazu, beim Parsen einer sehr großen XML-Datei (bis 300MB) Zustandsinformationen zu verwalten. Wegen der Dateigröße arbeite ich mit SAX und nicht mit DOM.
Die Verarbeitung der Daten erfolgt durch mehrere Implementierungen von [c]XMLFilterImpl[/c], die in einer Filter-Kette miteinander verknüpft sind. Da ist es praktisch, wenn sich die verschiedenen Implementierungen von [c]startElement[/c] usw. einfach die Instanz der Zustandsverwaltung besorgen können.
Wenn du mehr als ein Objekt haben willst, ist es natürlich erst recht falsch, denn - wie der Name schon sagt - darf es nur ein Objekt der Singleton-Klasse geben.
Habe ich mir ja auch fast gedacht. Ich war mir nur nicht ganz sicher, wie es sich mit den Servlet-Threads verhält. Also ob es pro Thread evtl. ein eigenes Objekt gibt. Aber weil es eben nur ein Objekt für alle Threads gibt, muss ich das anders lösen.
@SlaterB:
in deinem Link bei IBM steht ja ganz gutes Beispiel.
Ich bin aber nicht sicher, ob ich den erläuternden Text und das Beispiel richtig verstanden habe.
Im Beispiel steht dieser Code:
Java:
public class ConnectionDispenser {
private static class ThreadLocalConnection extends ThreadLocal {
public Object initialValue() {
return DriverManager.getConnection(ConfigurationSingleton.getDbUrl());
}
}
private static ThreadLocalConnection conn = new ThreadLocalConnection();
public static Connection getConnection() {
return (Connection) conn.get();
}
}
Gehört der Aufruf [c]ConfigurationSingleton.getDbUrl()[/c] zu einer "echten" Singleton-Klasse? Das kann doch eigentlich nicht sein, aber der Name legt das nahe.
inwiefern kann es nicht sein?
es ist etwas merkwürdig gebaut (wenn schon dann doch gar keine Singletons), macht aber auch auf gewisse lehrreiche Weise Sinn,
die Configuration braucht man programmweit nur einmal, ist unveränderlich, unsterblich,
kann beliebig oft und gleichzeitig von mehreren Threads verwendet werden,
-> Singleton denkbar
die Connection selber gibts dagegen mehrfach, ist nur temporär, aber für die Zeit eines Threads hier quasi ein Singleton,
also ThreadLocal
es ist doch so, dass meine Servlet-Anwendung in mehreren Threads (pro Benutzer einer) läuft.
Innerhalb eines Threads soll jede Klasse bequemen Zugriff auf das Objekt haben, das bisher als Singleton realisiert ist. Ohne dass ich das Objekt als Parameter durch Methoden schleifen muss, wo es nicht gebraucht wird. Eben wie eine globale Variable.
Aber es muss gewährleistet sein, dass jeder Thread sein eigenes Objekt bekommt. Sonst bricht das Chaos aus.
EDIT:
SlaterB hat gesagt.:
die Configuration braucht man programmweit nur einmal, ist unveränderlich, unsterblich,
kann beliebig oft und gleichzeitig von mehreren Threads verwendet werden,
-> Singleton denkbar
die Connection selber gibts dagegen mehrfach, ist nur temporär, aber für die Zeit eines Threads hier quasi ein Singleton,
also ThreadLocal
schau dir Dependency Injection an... ich kann bis heute nicht verstehen woher der logische (kurz)schluss kommt, um die Problematik von "muss man ueberall durchschleifen" und das Nutzen von Singletons kommt.
hmm... feif: habe irgendwann mal ein Zitat aufgeschnappt, welches sinngemäß besagte, dass Progammierer von Natur aus faul sind, oder sein sollten. Ich kriegs leider nicht mehr zusammen