Design Patterns sind unabhängig von Programmiersprachen, wenn du ein bestimmtes Problem bei der Implementierung hast, solltest du das genauer ansprechen.
Eventuell wäre auch "Inversion of Control" bzw. "Dependency Injection" viel eher das, was du suchst.
Mein Problem liegt dadrin, das ich nicht weiß wie die Variablen bzw Objekte in der Registry gespeichert werden. Bei PHP funzt das ja mit nem simplen Array, was meines Wissen bei Java so nicht möglich ist.
In Zeile 9 passen nun die Typen nicht zueinander. Was kann man dagegen tun ?
Schließlich sollen ja in dieser "Registry" alle möglichen Typen gespeichert werden.
Edit: Des Weiteren ist das nicht natürlich, dass du SimpleBindings verwendest. Das ist für Skriptsprachen in Java gedacht. Wenn du einfach nur Objekte ablegen möchtest, um diese später über einen String wieder zu bekommen, reicht eine Map, wie oben bereits erwähnt, völlig aus.
@Jay
Sorry das ich dir erst jetzt danken kann. Hat mir zuerst sehr geholfen, aber bei meiner GUI mit Swing bin ich wieder am gleichen Problem stecken geblieben.
Beim Casten der Objekte gehen ja die Inhalt der ensprechenden Variablen verloren. Wie kann ich die Objekte nun so ablegen das ihre, Inhalte erhalten bleiben und ich sie dann unter nem Key in nem Table oder einer List ablegen kann. Ich dachte hier schon an Serialisierung, aber ich habe imo nur ne Serialiserung in ne XML gesehn und das wäre auf jedenfall zu Übertrieben.
Bei meinem konkreten Fall will ich mit Swing ne GUI haben, wo ich auch noch nach dem "Adden" zu dem enstprechenden Container drauf zugreifen und sie z.B. deaktivieren etc. .
das Problem ist, dass Du hier keinen so "einfachen" Weg finden wirst wie in PHP. Wie schon Jay sagte wird in Java der Datentyp statisch festgelegt. Um Dir das casten zu ersparen, vor allem aber um eine erhöhte Typsicherheit zu erreichen, kannst Du auf Generics zurückgreifen.
Ice-breaker zeigte zwar schon wie man Generics verwenden kann, unglücklicherweise wurde aber auf den Typ Object für die abgelegten Werte zurückgegriffen. Hier kann entsprechend ein beliebiges Objekt abgelegt werden.
Besser ist es einen spezifischen Typ zu verwenden. Am saubersten ist es, wenn Du ein Interface (oder eine abstrakte Basisklasse) erzeugst, welche alle Eigenschaften deklariert, die ein Registry Eintrag haben soll. Ein einfaches Beispiel könnte darin bestehen, dass ein solcher Eintrag eine String-Zeichenkette speichert und aktiviert/deaktiviert sein kann:
Java:
publicinterfaceIRegistryEntry{// Gibt den String-Wert zurückpublicStringgetValue();// Gibt zurück ob der Eintrag aktiviert ist oder nichtpublicbooleanisActive();}publicclassRegistryEntryimplementsIRegistryEntry{privatefinalString value;privateboolean isActivated;// KonstruktorpublicRegistryEntry(finalString value){// Ruft den anderen Konstruktor auf und setzt den Eintrag als aktiviertthis(value,true);}// KonstruktorpublicRegistryEntry(finalString value,finalboolean activated){this.value = value;this.isActivated = activated;}publicStringgetValue(){returnthis.value;}publicbooleanisActivated(){returnthis.isActivated;}publicvoidsetActivated(finalboolean activated){this.isActivated = activated;}}
Eine Map<String, IRegistryEntry> könntest Du jetzt mit Exemplaren der Klasse füllen, die Abrufen und z.B. den Status (aktiviert) setzen. Die Änderung wirkt sich auf die Variablen aus und wird auch korrekt gespeichert. Die Objekte liegen aber nur im Hauptspeicher und nur für die Laufzeit des Programms vor.
Ein anderes Thema wäre nun die Persistenz. Hierunter fällt das festschreiben der Registry, so dass diese Werte auch nach dem beenden des Programms zur Verfügung stehen (z.B. in einer Datei oder DB). Eine Möglichkeit die Registry festzuschreiben bestünde nun darin, dass Du diese serialisierst (und entsprechend beim Laden wieder deserialisierst). Das ist aber ein anderes Problem, dass von dem Pattern nicht berücksichtigt wird.
Zudem möchte ich explizit darauf hinweisen, dass dieses Pattern nicht unbedingt nach einer all zu sinnvollen Idee klingt. So wie es sich ließt kann es leicht und vermeintlich unbeabsichtigt dazu verleiten verstärkt mit globalen Variablen zu arbeiten. Die Verpackung in ein Objekt (das als Singleton vorliegt und leicht zugänglich ist) macht die Sache nicht wirklich besser. Ein sauberer Entwurf und ein ausreichendes Verständnis der OOP sollten in vielen Fällen die Verwendung einer Registry überflüssig machen, denke ich.