Я читал этот вопрос, который только что задали: Избегать утечек памяти в обратных вызовах?
И я был весьма сбит с толку, пока кто-то не ответил следующее:
«Проблема с этим подходом заключается в том, что у вас не может быть слушателя, на который есть только ссылка в коллекции, поскольку он исчезнет случайным образом (на следующем 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 выше, очевидно, использует старый вектор ], но это просто пример, чтобы показать, как я обычно создаю анонимный класс для использования в качестве слушатель).
В качестве дополнительного вопроса: когда ссылка на анонимного слушателя будет иметь право на сборщик мусора, если наблюдаемый субъект будет использовать WeakHashMap? Когда завершается работа основного метода ? Как только вызов obs.addObserver завершится?
Я немного запутался в том, где / как / когда ссылки на экземпляры анонимных классов хранятся / хранятся / становятся понятными для GC.
Очевидно, что если я сохраняю обычную ссылку, она не подходит для GC, но что, когда она находится в WeakHashMap, когда именно слушатель становится понятным для GC?