【发布时间】:2017-04-04 06:58:25
【问题描述】:
我遇到了这样的情况:
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 保留了对它的引用。
这似乎是一种常见的设计模式,但没有人解释如何避免这种循环引用?
【问题讨论】:
-
如果你想防止循环引用,只需在类(这里
A和B)之间建立单向而不是双向的关系。或者添加一个调解员(但最后可能会很丑)......编辑:这个问题属于Software Engineering SE -
@KarelG 我不能让它单向,因为 B 需要能够调用 A 上的方法(此外,如果 B 没有保留对 A 的引用,那么 A 将被销毁)。而且我无法删除从 A 到 B 的通信,因为 B 需要知道 A 何时发生某些事情。
标签: java oop observer-pattern circular-reference