Un altro caso utile per WeakHashMap
ed WeakReference
è un'implementazione del registro dell'ascoltatore .
Quando crei qualcosa che vuole ascoltare determinati eventi, di solito registri un ascoltatore, ad es
manager.registerListener(myListenerImpl);
Se manager
memorizza il tuo listener con a WeakReference
, ciò significa che non è necessario rimuovere il registro, ad esempio con a manager.removeListener(myListenerImpl)
perché verrà automaticamente rimosso una volta che il tuo listener o il tuo componente che detiene il listener diventa non disponibile.
Ovviamente puoi ancora rimuovere manualmente il tuo ascoltatore, ma se non lo dimentichi o lo dimentichi, non causerà una perdita di memoria e non impedirà che il tuo ascoltatore venga raccolto.
Da dove WeakHashMap
viene l'immagine?
Il registro degli ascoltatori che desidera archiviare gli ascoltatori registrati come WeakReference
s ha bisogno di una raccolta per memorizzare questi riferimenti. Non esiste WeakHashSet
un'implementazione nella libreria Java standard solo a, WeakHashMap
ma possiamo facilmente usare quest'ultima per "implementare" la funzionalità della prima:
Set<ListenerType> listenerSet =
Collections.newSetFromMap(new WeakHashMap<ListenerType, Boolean>());
Con questo listenerSet
per registrare un nuovo listener devi solo aggiungerlo al set, e anche se non viene rimosso esplicitamente, se il listener non viene più referenziato, verrà rimosso automaticamente dalla JVM.