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