Frage zu Singleton

CyberTim

Grünschnabel
Hallo zusammen!
Bei SWT bin ich auf ein problem gestoßen: wie realisiert man ein Singleton, wenn der Konstruktor einen Übergabeparameter hat?
Wenn ich jetzt eine eigene Klasse implementiere, von der es nur ein Exemplar geben wird, jedoch die Parameter für den Konstruktor unterschiedlich sein können...
wie macht man das üblicherweise?
Ich habs bisher so gemacht:

Code:
public class ABC extends XYZ{
	private static ABC instance = null;

	private Table(int a, int b, int c, int d) {
		super(a, b, c, d);
	}

	public static ABC getInstance(){
		return instance;
	}

	public static ABC getInstance(int a, int b, int c, int d){
		if (instance==null){
			instance = new ABC(a, b, c, d);
		}
		return instance;
	}
}

So wirklich zufriedenstellend ist das ganze aber nicht. Zuerst muss getInstance(a,b,c,d) aufgerufen werden und anschließend kann erst getInstance() aufgerufen werden. Sonst wird null zurückgegeben und es hagelt nur so Null-Pointer-Exceptions. Wenn jedoch bereits eine Instanz existiert und man ruft noch einmal getInstance(a,b,c,d) auf, so werden die Parameter ignoriert. Das halte ich auch für keine so tolle Lösung...

Wie wird das üblicher Weise realisiert?
 
CyberTim hat gesagt.:
So wirklich zufriedenstellend ist das ganze aber nicht. Zuerst muss getInstance(a,b,c,d) aufgerufen werden und anschließend kann erst getInstance() aufgerufen werden. Sonst wird null zurückgegeben und es hagelt nur so Null-Pointer-Exceptions. Wenn jedoch bereits eine Instanz existiert und man ruft noch einmal getInstance(a,b,c,d) auf, so werden die Parameter ignoriert. Das halte ich auch für keine so tolle Lösung...

Wie wird das üblicher Weise realisiert?

Wieso implementierst Du getInstance() nicht so:
Code:
	public static ABC getInstance(){
		if(instance == null)
		  instance = new ABC(0, 0, 0, 0);
		return instance;
	}
 
weil je nach Konfiguration die Parameter anders sind
okay, ich könnte jetzt die Parameter irgendwo abspeichern (konfiguartionsdatei oder vwas weiß ich) und dort auslesen.
Mal sehen, wie ich's mache...
Ich möchte halt die Modularität nicht verlieren...
 
Du könntest z.B. bei deiner getInstance (a, b, c, d) funktion noch ein flag-parameter mit einbauen, über welchen du signalisierst ob du die parameter mit übergeben willst oder ohne die parameter eine Instanz erzeugen willst.

Sprich so:

public static ABC getInstance(int a, int b, int c, int d, boolean flag) {

if (flag) {
//dein aktueller code;

}

//dein getInstance() Code;
}

Allerdings muss ich sagen, das es keinen Sinn macht bei getInstance() einfach nur ein return zu machen. Die gefahr ist gross, das wenn derjenige das anwendet die instanz nicht initialisiert ist und dann?

Dann gibt es null-pointer exceptions bei demjenigen der sie benutzt wenn nicht die diesbzgl. abfrage da ist. das widerspricht doch irgendwie der ganzen singleton idee.

Ansonsten vielleicht die funktion einfach umbennen.....

Weil bei getInstance rechnet jeder damit, dass er eine Instanz der funktion zurückbekommt (sprich entweder eine schon instanzierte, oder wenn nicht eine neu instanzierte und kein null).


Grüsse

Torsten.
 
Das erinnert schon eher an eine Factory-Klasse, die für solche Anwendungsfälle ideal ist:

Code:
public class Factory {
 
public static ABC getSpecialABC() {
  //...
}
 
public static ABC getNormalABC() {
  //...
}
 
}
Die Implementierung hier ist wie "mehrere Singeltons"... :)
 
Zurück