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



我正在修复一个遗留应用程序,该应用程序存在对象由实现Observable的类中的观察者列表保留的问题。正确地移除观察员将是一项漫长的任务,所以我想我可以使用WeakReference来克服这一问题。问题是,调用Observable.addObserver(new WeakReference(something))是不可能的,因为WeakReference没有实现Observer。所以我想创建一个名为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);
}
}

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

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

您可能可以做到这一点,但您希望您的弱可观察器具有对真实Observables的弱引用,而不是的弱引用。

此外,仅仅允许真正的观察者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);
        }
    }
}

WeakObserver特定于单个Observable,这对于在底层真实Observer为GC’d时自动删除它是必要的。如果您愿意并且能够适当地修改Observable,则可以使用ReferenceQueue来避免这种情况。

(根据我的评论构建)您可以依赖WeakReference的get方法,而不是保留引用。该类也可以参数化,因此在更新方法中不需要强制转换:

private class ObserverWeak extends WeakReference<Observer> implements Observer{
    public ObserverWeak(Observer referent) {
        super(referent);
    }
    @Override
    public void update(Observable obs, Object arg) {
        if ( super.get() != null ){
            super.get().update(obs, arg);
        }
    }

}

相关内容

  • 没有找到相关文章

最新更新