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吗?

谢谢。

解决方法

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

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