首页 > 解决方案 > WeakReference<> 在这种特定情况下是否有助于 GC?

问题描述

我不确定从长远来看这是否会给我带来一些内存泄漏问题,我想知道在这种情况下使用弱引用是否有什么不同:

public abstract class ChangeObserver<X extends SomeClass> {

   X someClass;

   public ChangeObserver(X someClass) {
       this.someClass= someClass;
   }

   public void notifySomeClass(
   ) {
       onChanged().onChanged(someClass);
   }

   public abstract OnDataChanged<X> onChanged();

   @FunctionalInterface
   public interface OnDataChanged<X> {
       void onChanged(X x);
   }

}

这会在程序的生命周期中引起问题吗?它会通过使用弱引用来解决吗?

感谢@Hulk 和@tashkhisi,我提供了这个解决方案,如果有什么遗漏,请不要犹豫,纠正它。

public abstract class ChangeObserver<X extends SomeClass> {

    private WeakReference<X> someClassWeakRef;
    private OnDataChanged<X> observer;

    public ChangeObserver(X someClass) {
        this.someClassWeakRef = new WeakReference<>(someClass);
        observer = onChanged();
    }

    public void notifySomeClass(
    ) {
        observer.onChanged(someClassWeakRef.get());
    }

    public abstract OnDataChanged<X> onChanged();

    @FunctionalInterface
    public interface OnDataChanged<X> {
        void onChanged(X x);
    }

}

我仍然缺少的是这个 removeObserver() 方法究竟应该做什么来删除观察者,如果我要使用避免内存泄漏的特定方法,它只是简单地设置观察者 = null 吗?

提前致谢。

标签: javamemory-leakslifecycleweak-references

解决方案


是的,有很多方法可以Observer在 Java 中解决 Pattern 中的内存泄漏,其中一种是在您的类中添加另一种方法,以便在您不再需要它们时removeObserver删除 Observer 对象,第二种方法是使用弱引用,如下所示Observable:(我宁愿命名它someObject而不是someClass但我遵守了你的命名约定)

WeakReference<X> x = new WeakReference<X>(someClass); 

推荐阅读