Ein weiterer nützlicher Fall für WeakHashMap
und WeakReference
ist eine Listener-Registrierungsimplementierung .
Wenn Sie etwas erstellen, das bestimmte Ereignisse abhören möchte, registrieren Sie normalerweise einen Listener, z
manager.registerListener(myListenerImpl);
Wenn der manager
Speicher Ihren Listener mit a speichert WeakReference
, bedeutet dies, dass Sie das Register nicht entfernen müssen, z. B. mit a, manager.removeListener(myListenerImpl)
da es automatisch entfernt wird, sobald Ihr Listener oder Ihre Komponente, die den Listener enthält, nicht mehr verfügbar ist.
Natürlich können Sie Ihren Listener immer noch manuell entfernen, aber wenn Sie dies nicht tun oder vergessen, führt dies nicht zu einem Speicherverlust und verhindert nicht, dass Ihr Listener Müll sammelt.
Wo kommt WeakHashMap
das ins Bild?
Die Listener-Registrierung, die registrierte Listener als WeakReference
s speichern möchte, benötigt eine Sammlung zum Speichern dieser Referenzen. Es gibt keine WeakHashSet
Implementierung in der Standard-Java-Bibliothek nur a, WeakHashMap
aber wir können die letztere leicht verwenden, um die Funktionalität der ersten zu "implementieren":
Set<ListenerType> listenerSet =
Collections.newSetFromMap(new WeakHashMap<ListenerType, Boolean>());
Damit wird listenerSet
ein neues Listener registrieren müssen Sie nur an die Set hinzuzufügen, und auch wenn es ausdrücklich nicht entfernt wird, wenn der Hörer wird nicht mehr Bezug genommen wird , wird sie automatisch von der JVM entfernt werden.