Ще один корисний випадок WeakHashMapі WeakReferenceє реалізація реєстру для слухачів .
Коли ви створюєте щось, що хоче слухати певні події, зазвичай ви реєструєте слухача, наприклад
manager.registerListener(myListenerImpl);
Якщо managerзберігається ваш слухач із символом a WeakReference, це означає, що вам не потрібно видаляти реєстр, наприклад, з-за того, manager.removeListener(myListenerImpl)що він буде автоматично видалений, як тільки ваш слухач або ваш компонент, який тримає слухача, стануть недоступними.
Звичайно, ви все одно можете видалити слухача вручну, але якщо ви цього не зробите або забудете, це не спричинить витік пам’яті та не завадить вашому слухачеві збирати сміття.
Де WeakHashMapвходить у картину?
Реєстр слухачів, який бажає зберігати зареєстрованих слухачів, як WeakReferences потребує колекції для зберігання цих посилань. У WeakHashSetстандартній бібліотеці Java немає жодної реалізації, WeakHashMapале ми можемо легко використовувати останню для "реалізації" функціональності першої:
Set<ListenerType> listenerSet =
Collections.newSetFromMap(new WeakHashMap<ListenerType, Boolean>());
Зважаючи на це, listenerSetщоб зареєструвати нового слухача, ви просто повинні додати його до набору, і навіть якщо він не буде видалено явно, якщо слухач більше не посилається, він автоматично буде видалений JVM.