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