我们应该在观察者模式中使用 Wea​​kReference 吗?

hac*_*tsu 5 java design-patterns

我正在学习并尝试从本教程中用Java 实现观察者模式。我被困在我是否应该使用WeakReference主题来容纳观察者的问题上。

对于下面的实现, theSubject和 theBinaryObserver相互持有强引用,我担心这会阻止 GC 收集未使用的Subject.

所以我的问题是,我应该使用List<WeakReference<Observer>> observers而不是List<Observer> observers吗?

主题.java

public class Subject {

   private List<Observer> observers = new ArrayList<Observer>();
   private int state;

   public int getState() {
      return state;
   }

   public void setState(int state) {
      this.state = state;
      notifyAllObservers();
   }

   public void attach(Observer observer){
       observers.add(observer);
   }

   public void notifyAllObservers(){
       for (Observer observer : observers) {
           observer.update();
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

观察者.java

public abstract class Observer {
    protected Subject subject;
    public abstract void update();
}
Run Code Online (Sandbox Code Playgroud)

BinaryObserver.java

public class BinaryObserver extends Observer{

    public BinaryObserver(Subject subject){
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Binary String: " + Integer.toBinaryString());
    }
}
Run Code Online (Sandbox Code Playgroud)

观察者模式演示程序

public class ObserverPatternDemo {
    public static void main(String[] args) {
       Subject subject = new Subject();

       new BinaryObserver(subject);

       System.out.println("First state change: 15");
       subject.setState(15);
    }
}
Run Code Online (Sandbox Code Playgroud)

Loc*_*Loc 2

您不必在您的情况下使用弱引用。你正在做的事情很好。Java GC 已经处理循环引用。如果它(图)是一个岛,Java GC 将收集整个循环引用图(没有从根到图的传入引用 - 您可以认为整个图是一个大对象,GC 将收集这个大对象如果有没有提及它)

看看这个:Java 垃圾收集如何与循环引用一起工作?