# Singleton Registry Problem



## Arthur1990 (10. Apr 2012)

Hallo
ich muss für die Schule eine SingletonRegistry schreiben.
Dafür haben wir ein interface bekommen.
Es hat 3 Methoden die wir selber schreiben sollen.
Nun weiß ich aber nicht genau wie ich das machen soll.
Hab im Internet nicht wirklich was gefunden und wollte jetzt hier mal nachfragen.

```
public interface SingletonRegistry extends PropertyListenSupport {
    /**
     * Method to be called by a library upon static initialization to register
     * the given class so that the only instance can be retrieved.
     * @param <T> generic placeholder for the interface class
     * @param clazz the class of the object to be retrieved
     * @param value the single implementation of the class
     */
    public <T> void registerInstance(Class<T> clazz, T value);

    /**
     * Method to be called by a library in case a service shall be made
     * unavailable
     * @param <T> generic placeholder for the interface class
     * @param clazz the class of the object to be revoked
     */
    public <T> void unregisterInstance(Class<T> clazz);

    /**
     * Method to retrieve the implementation of the class given as parameter.
     * @param <T> generic placeholder for the interface class
     * @param clazz the class of the object to be retrieved
     * @return an instance of the class or null, if the instance could not
     * be retrieved
     */
    public <T> T retrieveInstance(Class<T> clazz);
}
```
Hoffe hab es richtig eingefügt.
Bin für jede Hilfe offen.

Gruß


----------



## Jodo (10. Apr 2012)

Hi,
Ihr habt doch bestimmt eine Aufgabenstellung mit zusätzlichen Klassen die ihr implementieren, bzw die dieses Interface implementieren, sollt oder? Wenn du uns das Interface vorlegst bringt uns das reichlich wenig.

Und es ist immer besser, wenn du selbst Code schreibst und dann frägst wieso ein bestimmter Fehler auftritt.
Wenn du mehrere Singletons registrieren sollst und die Anzahl vorher nicht kennst, könntest du ja zum Beispiel schon mal eine geeignete Datenstruktur, etwa eine Liste, benutzen und versuchen dort die Singletons ablegen. Bisschen mehr Eigeninitiative 

Gruß
Jodo


----------



## Arthur1990 (10. Apr 2012)

Ich hab hier noch meine Lösungsansätze die ich teilweise irgendwie hingewurschtelt habe.

```
public <T> void registerInstance(Class<T> clazz, T value) {
        try {
            instance = (SingletonRegistryImpl) clazz.newInstance();
        } catch (InstantiationException ex) {
            Logger.getLogger(SingletonRegistryImpl.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(SingletonRegistryImpl.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
```


```
public <T> void unregisterInstance(Class<T> clazz) {
        try {
            instance.finalize();
        } catch (Throwable ex) {
            Logger.getLogger(SingletonRegistryImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
```


```
public <T> T retrieveInstance(Class<T> clazz) {
        if (instance == null) {
            instance = new SingletonRegistryImpl();
        }
        return (T) instance;
    }
```

Im Internet hab ich noch erfahren das es eine Methode getInstance geben muss die bei mir so aussieht.

```
public static SingletonRegistry getInstance() {
        if (instance == null) {
            instance = new SingletonRegistryImpl();
        }
        return instance;
```


Hab die ausm Internet und sie sieht den anderen Methoden sehr ähnlich.

Wir haben vom Prof einen jUnit Test bekommen der unsere Methoden testen soll.
Aus dem werde ich aber auch nicht schlau.
Wenn ich den durchlaufen lasse zeigt er mir überall nur NullPointerExceptions an.
Auf Wunsch kann ich den Code auch noch posten.

Gruß


----------



## Marcinek (10. Apr 2012)

Ist das überhaupt kompilierbar, was du geschrieben hast? - Denke ich nicht. 

Wahrscheinlicher ist:

"ich habe was im internetgefunden, das "register" im Text hatte - Liebes java Forum ist das richtig?".

Definitv nein.

Bitte nochmal die Aufgabenstellung genauer lesen.


----------



## Gast2 (10. Apr 2012)

Überleg dir erstmal was dein SingletonRepository können muss, das steht größtenteils in den Kommentaren. Der Code den du gepostet hast macht von vorne bis hinten keinen Sinn.
Nachdem du dir das überlegt hast kannst du nochmal versuchen das zu implementieren.


----------



## nillehammer (10. Apr 2012)

Implementiere in Deiner Registry eine java.util.Map mit Class<T> als Keys. Da jeder Key nur einmal vorkommen kann (Standardverhalten einer Map), hast Du von jedem registrierten Objekt nur eins. Je nach dem, ob registrierte Objekte überschrieben werden können sollen, kannst du in der register-Methode vorher mit containsKey prüfen, ob ein entspr. Key schon in der Map ist.

Wenn Die Registry selbst ein Singleton sein soll, empfehle ich das Singleton-Enum-Pattern.


----------



## Firephoenix (10. Apr 2012)

So wie ich das verstehe sollst du nur die Aufrufe passend an ein Feld vom Typ Map weiterleiten dass die Klassen als Keys verwaltet.
Als Singleton könntest du dann die gesamte Registry-Klasse implementieren, dass lese ich aber als "kann" und nicht "muss" und hat mir der ersten Aufgabenstellung auch nichts zu tun.
Gruß


----------



## Arthur1990 (10. Apr 2012)

Okay also ich habe jetzt die HashMap erstellt.
Hab demnach meine Methoden umgeschrieben.


Ich hab jetzt die 3 Methoden:



```
static SingletonRegistryImpl instance = new SingletonRegistryImpl() {};
    PropertyChangeSupport change = new PropertyChangeSupport(this);
    private final Map<Class, Object> singleton = new HashMap<Class, Object>();

public static SingletonRegistry getInstance() {
      return instance;}
```




```
public <T> void registerInstance(Class<T> clazz, T value) {
        if (singleton.containsKey(clazz)) {
        } else {
            singleton.put(clazz, value);
        }
```

Hier frage ich zuerst ab ob die Klasse schon vorhanden ist.
Weiß aber nicht was ich machen soll wenn schon vorhanden.
Habs mal leer gelassen.
Und ansonsten schreibe ichs es in die Map rein
ist das richtig so?



```
public <T> void unregisterInstance(Class<T> clazz) {
        singleton.remove(clazz);
```



```
public <T> T retrieveInstance(Class<T> clazz) {

        return (T) singleton.get(clazz);

    }
```

Hab das jetzt soweit.

Gruß


----------



## nillehammer (10. Apr 2012)

Arthur1990 hat gesagt.:
			
		

> Hier frage ich zuerst ab ob die Klasse schon vorhanden ist.
> Weiß aber nicht was ich machen soll wenn schon vorhanden.
> Habs mal leer gelassen.


Wie würdest Du es interpretieren? Sollte ein Verwender (Programmierer) Deiner Registry eigentlich wissen, was er schon registriert hat? Dann wäre es ein Programmierfehler und das Werfen einer RuntimeException mit aussagefähiger Fehlermeldung wäre angebracht. Das wäre auch der Weg, den Programmierer adäquat zu informieren. Wenn es aber eher egal ist, dann solltest Du es wenigstens Loggen/mit System.out.println sichtbar machen. Wenn ich Du wäre, würde ich eine RuntimeException/IllegalArgumentException schmeißen.


			
				Arthur1990 hat gesagt.:
			
		

> Und ansonsten schreibe ichs es in die Map rein
> ist das richtig so?


Sieht gut aus.


----------

