我可以将 WeakReference 传递给 Observable 监听器吗?

Nep*_*daj 5 java weak-references observer-pattern

我正在修复一个遗留应用程序,该应用程序存在对象被实现 Observable 的类中的观察者列表保留的问题。正确地删除观察者将是一项漫长的任务,所以我想我可以用来WeakReference克服这个问题。问题是,由于没有实现观察者,所以调用Observable.addObserver(new WeakReference(something))是不可能的。WeakReference所以我想到创建WeakObserver这样的类:

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);
}
}
Run Code Online (Sandbox Code Playgroud)

这里的问题非常明显 - 除了方法中的不安全转换之外update,我正在创建另一个对我想要垃圾收集的对象的引用。

这样的事情有可能吗,还是我想做一些愚蠢的事情?

Joh*_*ger 3

你也许可以做到这一点,但你希望你的弱可观察量对实数弱引用Observable,而不是成为弱引用。

此外,仅仅让真正的观察者被 GC 是不够的;您还需要在Observable发生这种情况后取消注册包装器对象。这种事情就是引用队列的用途,但如果你不想修改类,Observable那么你可以像这样快捷方式:

public class WeakObserver implements Observer {
    private final WeakReference<Observer> observer;
    private final Observable observed;

    public WeakObserver(Observer observer, Observable observed){
        this.observer = new WeakReference<Observer>(observer);
        this.observed = observed;
    }

    @Override
    public void update(Observable o, Object arg) {
        Observer realObserver = observer.get();

        if (realObserver != null) {
            realObserver.update(o, arg);
        } else {
            observed.deleteObserver(this);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

WeakObserver是特定于 single 的Observable,因为当底层实数被 GC 时,需要自动删除它ObserverReferenceQueue如果您愿意并且能够适当修改,则可以通过使用 a 来避免这种情况Observable