Я читал только что заданный вопрос: Избегать утечек памяти при обратных вызовах?
И я был очень сбит с толку, пока кто-то не ответил следующее:
«Проблема с этим подходом в том, что у вас не может быть прослушивателя, на который есть только ссылка в коллекции, поскольку он исчезнет случайным образом (при следующем GC)»
Правильно ли я понимаю, что использование слабых ссылок, например, когда они хранятся в WeakHashMap, несовместимо с анонимными слушателями?
Обычно я передаю такие слушатели:
public static void main(String[] args) {
final Observable obs = new SomeObservable();
obs.addObserver(new Observer() {
public void update(final Observable o, final Object arg) {
System.out.println("Notified");
}
});
obs.notifyObservers();
... // program continues its life here
}
private static final class SomeObservable extends Observable {
@Override
public void addObserver(final Observer o) {
super.addObserver(o);
setChanged(); // shouldn't be done from here (unrelated to the question)
}
}
И я отслеживаю слушателей, используя CopyOnWriteArrayList (по умолчанию Observable выше, по-видимому, использует старый Vector, но это просто пример, чтобы показать, как я обычно создают анонимный класс для использования в качестве слушателя).
В качестве дополнительного вопроса: когда ссылка на анонимного слушателя будет иметь право на сборку мусора, если наблюдаемый субъект будет использовать WeakHashMap? Когда завершается работа метода main? Как только вызов obs.addObserver завершится?
Я немного смущен тем, где / как / когда ссылки на анонимные экземпляры классов хранятся / хранятся / становятся понятными для GC.
Очевидно, что если я сохраняю обычную ссылку, она не подходит для GC, но что, когда она находится в WeakHashMap, когда именно слушатель становится понятным для GC?