Un autre cas utile pour WeakHashMap
et WeakReference
est une implémentation de registre d'écoute .
Lorsque vous créez quelque chose qui veut écouter certains événements, vous enregistrez généralement un auditeur, par exemple
manager.registerListener(myListenerImpl);
Si le manager
stocke votre auditeur avec un WeakReference
, cela signifie que vous n'avez pas besoin de supprimer le registre, par exemple avec un manager.removeListener(myListenerImpl)
car il sera automatiquement supprimé une fois que votre auditeur ou votre composant contenant l'écouteur devient indisponible.
Bien sûr, vous pouvez toujours supprimer manuellement votre auditeur, mais si vous ne le faites pas ou si vous l'oubliez, cela ne provoquera pas de fuite de mémoire et n'empêchera pas votre auditeur d'être récupéré.
D'où WeakHashMap
vient la photo?
Le registre d'écouteurs qui souhaite stocker les écouteurs enregistrés en tant que WeakReference
s a besoin d'une collection pour stocker ces références. Il n'y a pas d' WeakHashSet
implémentation dans la bibliothèque standard Java seulement WeakHashMap
mais nous pouvons facilement utiliser cette dernière pour "implémenter" la fonctionnalité de la première:
Set<ListenerType> listenerSet =
Collections.newSetFromMap(new WeakHashMap<ListenerType, Boolean>());
Avec cela listenerSet
pour enregistrer un nouvel écouteur il suffit de l'ajouter à l'ensemble, et même s'il n'est pas supprimé explicitement, si l'écouteur n'est plus référencé, il sera automatiquement supprimé par la JVM.