Ein weiterer nützlicher Fall für WeakHashMapund WeakReferenceist 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 managerSpeicher 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 WeakHashMapdas ins Bild?
Die Listener-Registrierung, die registrierte Listener als WeakReferences speichern möchte, benötigt eine Sammlung zum Speichern dieser Referenzen. Es gibt keine WeakHashSetImplementierung in der Standard-Java-Bibliothek nur a, WeakHashMapaber 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 listenerSetein 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.