Un altro caso utile per WeakHashMaped 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 managermemorizza 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 WeakHashMapviene l'immagine?
Il registro degli ascoltatori che desidera archiviare gli ascoltatori registrati come WeakReferences ha bisogno di una raccolta per memorizzare questi riferimenti. Non esiste WeakHashSetun'implementazione nella libreria Java standard solo a, WeakHashMapma possiamo facilmente usare quest'ultima per "implementare" la funzionalità della prima:
Set<ListenerType> listenerSet =
Collections.newSetFromMap(new WeakHashMap<ListenerType, Boolean>());
Con questo listenerSetper 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.