addObserver()方法,观察者模式和对象变量生命周期/范围,Java

时间:2013-02-27 08:18:02

标签: java observer-pattern

当我使用方法.addObserver()时,例如:

  class ExampleOne implements Observer {

  class ExampleTwo extends Observable {


  ExampleOne one = new ExampleOne();

  ExampleTwo two = new ExampleTwo();

  two.addObserver(one)

在这种情况下,实例对象“两个”和“一个”之间的连接或类似静态情况的class.class,它看起来像实例,但不确定,如果这是观察者和观察者之间的连接然后观察如果“一个”或“两个”被垃圾收集或超出范围会发生什么?这会破坏观察者的设置。

这样的示例是当服务器从客户端接收String消息时,观察者用于在新文本消息到达时通知。如果其中一个实例变量超出范围并被垃圾收集,那么当消息到达时将不再有通知,因为系统将被破坏。这是对的吗?

2 个答案:

答案 0 :(得分:2)

Observable有一个vector 为所有使用addObserver()方法注册的观察者保留参考。因此,即使观察者超出范围,对它的引用仍然存在于observable中,并且不会被垃圾收集

要进行垃圾收集,请调用removeObserver,然后进行垃圾回收。

如果Observable超出范围,则是,现在不会向观察者发送任何通知。观察员可以被垃圾收集。

  

在这种情况下,实例对象之间的连接是“两个”和   “one”或class.class,如静态情况

是的,一切都在实例上发生,此处不涉及任何静力学。

答案 1 :(得分:0)

Observable保留对添加到其中的每个观察者的引用,直到被明确删除。 因此,Observer只有在Observable的情况下才有资格进行垃圾收集。

除非您的代码引入,否则Observable没有后向引用。因此,保持对Observer的引用不会阻止Observable进行垃圾回收。

您可以随时查看Observable源代码以了解它是如何完成的:

public synchronized void addObserver(Observer o) {
    if (o == null)
        throw new NullPointerException();
if (!obs.contains(o)) {
    obs.addElement(o);
}
}

其中obs是一个Vector,它保留对其元素的引用。