Я исправляю устаревшее приложение, у которого есть проблема с сохранением объектов списком наблюдателей в классе, реализующем Observable. Правильное удаление наблюдателей было бы большой задачей, поэтому я решил использовать WeakReference
, чтобы преодолеть это. Проблема в том, что вызов Observable.addObserver(new WeakReference(something))
невозможен, так как WeakReference
не реализует Observer. Так я думал о создании класса называется WeakObserver
так:Могу ли я передать WeakReference наблюдаемым слушателям?
public class WeakObserver<T> extends WeakReference<T> implements Observer {
private T observer;
public WeakObserver(final T observer){
super(observer);
this.observer = observer;
}
@Override
public void update(Observable o, Object arg) {
((Observer)observer).update(o, arg);
}
}
Проблема здесь вполне очевидна - помимо не безопасных отлиты в update
методе, я создаю еще одну ссылку на объект, который я хочу, чтобы получить мусор ,
Является ли что-то вроде этого даже возможным, или я пытаюсь сделать что-то глупое?
Итак, объекты 'Observer', которые вы хотите разрешить быть GC'd, и проблема в том, что они зарегистрированы в списке« Наблюдаемые »? –
Да, точно. Единственное, о чем я могу думать, это переопределить методы «Observable» для использования 'WeakReference' объектов –
NeplatnyUdaj
Нужен ли WeakObserver наблюдателю переменных экземпляра? Почему бы не полагаться на метод get() метода WeakReference в методе обновления - проверить, является ли null, а если не делегировать вызов ненулевой ссылке? – copeg