Wie lookup-and-create-on-demand umsetzen?

Status
Nicht offen für weitere Antworten.

TSH

Bekanntes Mitglied
Ich will meine Anliegen mal etwas ausführlicher erläutern:

- Ich möchte eine Klasse Repository haben, um "items" zu verwalten.
- Repository ist ein Singleton.
- Repository soll erstmal leer sein.
- andere Objekte rufen repository.getItem("ABC") auf

Fall 1: Zu "ABC" existiert ein item:
Repository liefert das zum String "ABC" gespeicherte Objekt zurück

Fall 2: "ABC" existiert nicht:
Repository erzeugt es aus dem übergebenem String "ABC", merkt es sich und gibt es zurück.

Bei der nächsten Anfrage kann das Repository das passende Objekt zu "ABC" direkt ausgeben.

Ich frage mich gerade, welche Java-Klassen so ein Konzept vorsehen, so dass ich von ihnen erben kann oder sie mir näher anschauen kann. Das ist doch sicherlich ein bekannter Fall, oder?
 
C

ck2003

Gast
Wenn ich dich richtig vestanden habe, musst du es nur genauso machen, wie du es beschrieben hast.
Beispiel:

Code:
import java.util.HashMap;

public class Repository
{

    private HashMap<String, User> objects;

    public User getItem(String key)
    {
        User user = getObjects().get( key );
        if ( user == null )
        {
            user = new User( key );
            getObjects().put( key, user );
        }
        return user;
    }

    public HashMap<String, User> getObjects()
    {
        if ( this.objects == null )
        {
            this.objects = new HashMap<String, User>();
        }
        return this.objects;
    }

    public class User
    {
        private final String name;

        public User(String name)
        {
            this.name = name;

        }

        public String getName()
        {
            return this.name;
        }
    }
}
 

HoaX

Top Contributor
ja, ich würde sogar Repository von HashMap erben lassen und einfach "get" überschreiben
 

happy_robot

Bekanntes Mitglied
ARadauer hat gesagt.:
ich nicht, aggregation ist oft besser als vererbung.
ACK!!!!

die HashMap hat die Funktionalität jeglichen Datentyp verwalten zu können. eine spezialisierung bezüglich datentypen ist also sicherlich NICHT notwendig. containerklassen abzuleiten ist äusserst selten notwendig. die funktionalität die man braucht ist daher in nicht als ableitung notwendig.
ich würde aber eher komposition vorschlagen. da weiß man eher wer wann was wo erstellt hat. eine aggregation ist aber durchaus flexibler, würde ich aber eher in helper-klassen anwenden die generelle funktionalität anbieten .

das was man da "bei bedarf" erstellt ist übrigens das proxy-pattern. saueinfach, aber auch gold wert.

eine hoch auf die GoF!!!! :)
 

TSH

Bekanntes Mitglied
Danke Euch allen. Ich hab mich parallel auch umgeschaut, was es beim Springframework so gibt (das nutz ich nämlich) und bin auf folgendes gestoßen: DefaultSingletonBeanRegistry

Hab's jetzt so gelöst:
Code:
if (this.containsSingleton(id)) {
  bean = (ItemBean) this.getSingleton(id);
} else {
  bean = this.getItemBeanFactory().createItemBean(id);
  this.registerSingleton(id, bean);
}
Ich glaub, das ist ok so, oder?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben