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)
您不必在您的情况下使用弱引用。你正在做的事情很好。Java GC 已经处理循环引用。如果它(图)是一个岛,Java GC 将收集整个循环引用图(没有从根到图的传入引用 - 您可以认为整个图是一个大对象,GC 将收集这个大对象如果有没有提及它)
| 归档时间: |
|
| 查看次数: |
1429 次 |
| 最近记录: |