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