Еще один полезный случай для WeakHashMapи WeakReferenceявляется внедрение слушателем реестра .
Когда вы создаете что-то, что хочет прослушивать определенные события, обычно вы регистрируете слушателя, например
manager.registerListener(myListenerImpl);
Если managerваш слушатель хранит с WeakReference, это означает, что вам не нужно удалять регистр, например с, manager.removeListener(myListenerImpl)потому что он будет автоматически удален, как только ваш слушатель или ваш компонент, удерживающий слушателя, станет недоступным.
Конечно, вы все равно можете вручную удалить слушателя, но если вы этого не сделаете или не забудете, это не вызовет утечку памяти и не помешает вашему слушателю быть сборщиком мусора.
Откуда берется WeakHashMapкартина?
Реестр слушателей, который хочет хранить зарегистрированных слушателей как WeakReferences, нуждается в коллекции для хранения этих ссылок. В WeakHashSetстандартной библиотеке Java нет реализации, WeakHashMapно мы можем легко использовать последнюю для «реализации» функциональности первой:
Set<ListenerType> listenerSet =
Collections.newSetFromMap(new WeakHashMap<ListenerType, Boolean>());
При этом listenerSetдля регистрации нового прослушивателя вам просто нужно добавить его в набор, и даже если он не будет удален явно, если на прослушиватель больше не ссылаются, он будет автоматически удален JVM.