2

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

  class ExampleOne implements Observer {

  class ExampleTwo extends Observable {


  ExampleOne one = new ExampleOne();

  ExampleTwo two = new ExampleTwo();

  two.addObserver(one)

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

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

4

2 回答 2

2

Observable有一个vector包含对使用该方法注册的所有观察者的引用。addObserver()因此,即使观察者超出范围,对它的引用仍然存在于可观察对象中,并且不会被垃圾回收

垃圾收集它调用removeObserver然后它将被垃圾收集。

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

在这种情况下,是实例对象“二”和“一”之间的连接还是 class.class 像静态的情况

是的,一切都发生在实例上,这里不涉及静态。

于 2013-02-27T08:22:55.030 回答
-1

Observable 保留对添加到它的每个观察者的引用,直到显式删除。因此,只有在 Observable 可以进行垃圾收集时,Observer 才有资格进行垃圾收集。

除非您的代码引入,否则从 Observer 到 Observable 没有反向引用。所以保持对 Observer 的引用并不会阻止 Observable 进行垃圾收集。

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

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

Vector在哪里obs,它保留对其元素的引用。

于 2013-02-27T08:21:06.943 回答