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