ich den Schlüsseltyp auf Ihrem TreeMap gehe davon sollte ein Klasse sein, kein MyContainedObject.
Wenn Sie tatsächlich ChangeEvents für bestimmte Klassentypen überwachen müssen und Elemente auch nach dem Einstellen von Listenern zu Ihrer Sammlung hinzufügen können, erscheint dies ziemlich sinnvoll. Wahrscheinlich möchten Sie mehrere Listener für denselben Typ unterstützen. Sie sollten also entweder eine Multimap-Klasse verwenden (Google Collections hat einige) oder eine Sammlung (wahrscheinlich ein IdentityHashSet) für die Werte in Ihrer Map verwenden.
Sie können dem ChangeListener auch einen Typparameter hinzufügen, damit der Listener das Objekt, auf das das Ereignis gefeuert wurde, für den entsprechenden Typ abrufen kann.
interface ChangeListener<T> {
void changed(T obj, /* whatever */);
}
Sie müssen einen ungeprüften Guss innerhalb des Containers tun für diese zu arbeiten, aber es sollte sicher sein, solange Ihre Zuhörer Hinzufügen Methode das Richtige tut. zB:
public <T extends MyContainedObject> addChangeListener(Class<T> klass,
ChangeListener<? super T> listener) {
...
}
private <T extends MyContainedObject> Set<ChangeListener<? super T>> getChangeListeners(T obj) {
Set<ChangeListener<? super T>> result = new IdentityHashSet<ChangeListener<? super T>>();
for (Map.Entry<Class<? extends MyContainedObject>, Set<ChangeListener<?>>> entry : listeners.entrySet()) {
if (entry.getKey().isInstance(obj)) {
// safe because signature of addChangeListener guarantees type match
@SuppressWarnings("unchecked")
Set<ChangeListener<? super T>> listeners =
(Set<ChangeListener<? super T>>) entry.getValue();
result.addAll(listeners);
}
}
return result;
}
Eine kleine nit: Ich würde vermeiden „classname“, wie der Name einer Variablen verwenden, die ein Class-Objekt hält. Ein Klassenname ist ein String, normalerweise das Ergebnis von Class.getName(), etc .. Es ist ein bisschen nervig, aber die Konvention, die ich normalerweise gesehen habe, um die Tatsache zu umgehen, dass "Klasse" ein reserviertes Wort ist, ist falsch es ist entweder "klass" oder "cls".
Wenn Sie die Sammlung nicht aktualisieren müssen, nachdem Sie Listener hinzugefügt haben, dann würde ich mit dem vorgeschlagenen akf gehen, da es einfacher ist.
Danke. Genau das hatte ich vor. Sie haben auch Recht, dass ich meine Klasse und nicht MyContainedObject gemeint habe. – javacavaj