У меня есть 3 предложения для оригинального постера. Извините за возрождение старой темы, но я думаю, что мои решения ранее не обсуждались в этой теме.
Во-первых,
Рассмотрим следующий пример javafx.beans.values.WeakChangeListener в библиотеках JavaFX.
Во-вторых,
Я поднял шаблон JavaFX, изменив методы addListener моего Observable. Новый метод addListener () теперь создает экземпляры соответствующих классов WeakXxxListener для меня.
Метод «событие пожара» был легко изменен, чтобы разыменовать XxxWeakListeners и удалить их, когда WeakReference.get () вернул ноль.
Метод удаления теперь стал немного неприятнее, поскольку мне нужно перебрать весь список, а это значит, что мне нужно выполнить синхронизацию.
В-третьих,
До реализации этой стратегии я использовал другой метод, который может оказаться полезным. Слушатели (с жесткой ссылкой) получили новое событие, которое они проверили на предмет того, используются ли они до сих пор. Если нет, то они отписались от наблюдателя, что позволило им быть GCed. Для недолговечных слушателей, подписавшихся на долгоживущие Observables, обнаружить устаревание было довольно легко.
В знак уважения к людям, которые утверждали, что это «хорошая практика программирования - всегда отписывать своих слушателей, всякий раз, когда слушатель прибегает к отмене подписки, я обязательно создал запись в журнале и позже исправил проблему в моем коде.