java - 如何避免观察者模式的循环引用?

标签 java oop observer-pattern circular-reference

我遇到了这样的情况:

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/

相关文章:

java - SchedularFactory 是否使用新方法返回相同的实例

java - 尝试使用 Jackcess (Java) 从 Access 读取时出现 "unsupported collating sort order"

java - 类及其实例是什么意思? (java)

c# - 合并从多个实例触发的事件的可观察序列的正确方法

oop - 从嵌套结构通知观察者

java - 升级到版本为 2017.2.1 的新服务器后, Artifact 列中出现 "No Artifacts"

java - 创建名称为 'sessionFactory' 的 bean 时出错无法实例化默认 tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]

c++ - 如何安全地将包含的对象(菜单项)与需要容器(菜单)的 API 同步?

python 将方法从 classB 作为参数传递给 classA,然后从传递的 classB 方法调用 classA 中的方法

java - MVP 中的观察者模式