我遇到了这样的情况:
public class A
{
private ArrayList<Listener> listeners = new ArrayList<Listener>();
public A()
{
// stub
}
public void addListener(Listener listener)
{
this.listeners.add(listener);
}
public void removeListener(Listener listener)
{
this.listeners.remove(listener);
}
public interface Listener
{
// stub
}
}
public class B implements A.Listener
{
private A instanceOfA;
public B()
{
this.instanceOfA = new A();
this.instanceOfA.addListener(this);
}
}
我相信 B 永远不会被销毁,因为 A 保留了对它的引用,并且 A 永远不会被销毁,因为 B 保留了对它的引用。
这似乎是一种常见的设计模式,但没有人解释如何避免这种循环引用?
最佳答案
实际上,这个问题已经解决,观察者 B
不会直接引用 A
。它应该是一个小类,专注于处理其事件的唯一任务,并且不应该与 A
有任何直接耦合。事实上,这就是观察者模式的要点:一种向 A
添加代码的灵活方法,而无需对其进行硬依赖。
如果事件处理程序必须观察作为事件源的对象 (A
),则事件回调方法应声明一个 A
类型的参数,以便可以以无状态方式传递给处理程序,仅在事件处理期间使用,之后不保留。
关于java - 如何避免观察者模式的循环引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43200327/