Sie sind nicht angemeldet.

Markus

the one and only Unterstrich!

  • »Markus« ist der Autor dieses Themas

Beiträge: 2 571

Registrierungsdatum: 09.10.2003

1

18.08.2006, 17:56

Frage zum Singleton

Hu,

ich stehe gerade vor folgender Situation.

In einem Programm habe ich eine Klasse, die mehr oder weniger eine HashTabelle in ein Objekt verpackt plus noch ein paar Zusatzfunktionen.
Das ganze wird recht häufig im Programm genutzt, um nun zu verhindern dass zwei Instanzen davon entstehen habe ich mir also überlegt, das ganze als Singleton zu realisieren.

Scheinbar auch nicht weiter kompliziert verpackt man das ganze ungefähr wie folgt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
public final class myClass 
{
     private static final myClass INSTANCE = new Singleton();

     private myClass() {}

     public static Singleton getInstance() 
     {
         return INSTANCE;
     }
 }


So, nun habe ich aber das Problem, dass die Klasse so einige Parameter braucht um existieren zu können.
Daher die Frage: Gibt es da irgendeinen "idealen" Lösungsweg so etwas zu realisieren? Oder ist das beim Singleton gar nicht gewünscht?

Ich habe mir jetzt gedacht:
Eine Methode zur Verfügung stellen, die diese Parameter setzt. Stellt sich die Frage, was passiert, wenn man getInstance() aufruft und diese Parameter noch nicht gesetzt sind?
Darauf vertrauen, dass dieses nicht passiert?
Exception werfen -> Hätte zur Folge, dass man jedes mal bei getInstance mit try/catch bzw. throw arbeiten müsste. ):
Nichts tun und einfach sagen: Gibt dann an den entsprechenden Stellen Nullpointerexceptions -> Hm, sehr doof.
Als Instanz null zurückgeben -> auch doof.
Die Klassenvariabeln mit null initialisieren und in der Klasse Exceptions werfen, wenn mit ihr gearbeitet wird und die Variablen noch null sind -> Auch doof, außerdem müssen dann ja wieder von außen Exceptions abgefangen werden.
Eine andere Möglichkeit wäre, getInstance die Variablen mitzugeben (Instance wäre dann nicht final und würde erste in getInstance anfänglich das erste mal mit den Parameter gesetzt) - find ich aber auch ziemlich blöd.

Daher nun die Frage an euch: Vorschläge?
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

  • »Joachim« ist männlich

Beiträge: 2 863

Registrierungsdatum: 11.12.2001

Wohnort: Hämelerwald

Beruf: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

2

18.08.2006, 19:00

RE: Frage zum Singleton

Zitat

Original von Markus
In einem Programm habe ich eine Klasse, die mehr oder weniger eine HashTabelle in ein Objekt verpackt plus noch ein paar Zusatzfunktionen.
Das ganze wird recht häufig im Programm genutzt, um nun zu verhindern dass zwei Instanzen davon entstehen habe ich mir also überlegt, das ganze als Singleton zu realisieren.
Was wäre denn so schlimm daran, davon zwei Instanzen zu erzeugen?

Zitat

So, nun habe ich aber das Problem, dass die Klasse so einige Parameter braucht um existieren zu können.
Daher die Frage: Gibt es da irgendeinen "idealen" Lösungsweg so etwas zu realisieren? Oder ist das beim Singleton gar nicht gewünscht?

Ich habe mir jetzt gedacht:
[...]
Exception werfen -> Hätte zur Folge, dass man jedes mal bei getInstance mit try/catch bzw. throw arbeiten müsste. ):
Das fände ich am saubersten. Die Try-Catch-Blöcke sehe ich sogar fast positiv, weil dadurch auch im Code kenntlich gemacht wird, daß an getInstance() bestimmte Vorbedingungen geknüpft sind.
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

dfex

Junior Schreiberling

  • »dfex« ist männlich

Beiträge: 248

Registrierungsdatum: 11.12.2001

3

18.08.2006, 19:03

RE: Frage zum Singleton

Die Klasse vollständig und vernünftig mit dem Default-Constructor initialisieren und die zur verfügung gestellten Methoden auch ohne zusätzliche Informationen funktionstüchtig machen, sodass sie ein sinnvolles Ergebnis liefern (leere Vectoren z.b.)

Die getInstance Methode dann wie folgt gestalten:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
private static MyInterface m_instance = null;

private MySingleton(){
   // alles vernünftig initialisieren
}

public static MyInterface getInstance{
   if (m_instance == null)
      m_instance = new MySingleton();
   return m_instance;
}


Dann kannst du später im Programm den Singleton verwenden ohne weitere Parameter und/oder ihn scharf machen mittels MySingleton.getInstance().setInfoHere(...);

radicarl

Junior Schreiberling

  • »radicarl« ist männlich

Beiträge: 243

Registrierungsdatum: 07.10.2003

Wohnort: H-Town

4

19.08.2006, 11:18

wo kommen die Parameter denn her? Wenn das für die Singleton feststellbar ist kann sie sich doch die Daten selber holen.
Oder du arbeitest mit Design by Contract.
http://de.wikipedia.org/wiki/Design_by_Contract
Baust ne zweite Get-Methode die die nötigen Parameter liefert und den Konstructor aufruft. Mit DBC könntest du dann "sicherstellen" das deine parameterlose Get-Methode nur dann aufgerufen wird wenn schon eine Instanz existiert. Ist letzendlich das gleiche wie die Exceptionswerfen nur das du auf das try-catch verzichten kannst und in der Get-Methode deutlich gemacht wird was für Vorbedingugen für den Aufruf existieren müssen.
Da gibts sicher auch was fertiges für Java

Markus

the one and only Unterstrich!

  • »Markus« ist der Autor dieses Themas

Beiträge: 2 571

Registrierungsdatum: 09.10.2003

5

19.08.2006, 20:08

RE: Frage zum Singleton

Zitat

Original von Joachim
Was wäre denn so schlimm daran, davon zwei Instanzen zu erzeugen?

Der Speicherbedarf der eventuell großen HashTable.

Zitat

Die Klasse vollständig und vernünftig mit dem Default-Constructor initialisieren und die zur verfügung gestellten Methoden auch ohne zusätzliche Informationen funktionstüchtig machen, sodass sie ein sinnvolles Ergebnis liefern (leere Vectoren z.b.)

Ja, daran hab ich auch gedacht als eine Möglichkeit.

Zitat

wo kommen die Parameter denn her?

Während der Laufzeit vom Benutzer (Bsp: Dateipfad)

Zitat

Oder du arbeitest mit Design by Contract.

Habe ich noch nie gemacht, schau ich mir mal an.

Ja, dann danke für euer Meinungen, mal schaun wie ich das nu mach'.
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

AnyKey

Erfahrener Schreiberling

Beiträge: 451

Registrierungsdatum: 11.12.2001

Wohnort: H-Town

Beruf: Student

6

20.08.2006, 11:38

dier scheint ein guter link zu sein:
http://www.javaworld.com/javaworld/jw-04…gnpatterns.html
hab es aber nur überflogen.

"Der Mensch braucht Schubladen." -- Any Key

silence

Junior Schreiberling

Beiträge: 177

Registrierungsdatum: 11.12.2001

Wohnort: reagenzglas

Beruf: tellerwäscher

7

22.08.2006, 11:58

Zitat

Original von AnyKey
dier scheint ein guter link zu sein:
http://www.javaworld.com/javaworld/jw-04…gnpatterns.html
hab es aber nur überflogen.


Und bevor jeder nur noch Singletons benutzt der hier ... ;)
"Wir stecken immer in der Scheisse, nur die Tiefe ändert sich."
(Ein unbekannter Softwareentwickler)