Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

Markus

the one and only Unterstrich!

  • "Markus" started this thread

Posts: 2,571

Date of registration: Oct 9th 2003

1

Friday, August 18th 2006, 5:56pm

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:

Source code

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" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

2

Friday, August 18th 2006, 7:00pm

RE: Frage zum Singleton

Quoted

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?

Quoted

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" is male

Posts: 248

Date of registration: Dec 11th 2001

3

Friday, August 18th 2006, 7:03pm

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:

Source code

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" is male

Posts: 243

Date of registration: Oct 7th 2003

Location: H-Town

4

Saturday, August 19th 2006, 11:18am

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" started this thread

Posts: 2,571

Date of registration: Oct 9th 2003

5

Saturday, August 19th 2006, 8:08pm

RE: Frage zum Singleton

Quoted

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

Der Speicherbedarf der eventuell großen HashTable.

Quoted

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.

Quoted

wo kommen die Parameter denn her?

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

Quoted

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

Posts: 451

Date of registration: Dec 11th 2001

Location: H-Town

Occupation: Student

6

Sunday, August 20th 2006, 11:38am

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

Posts: 177

Date of registration: Dec 11th 2001

Location: reagenzglas

Occupation: tellerwäscher

7

Tuesday, August 22nd 2006, 11:58am

Quoted

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)