当我使用方法.addObserver()时,例如:
class ExampleOne implements Observer {
class ExampleTwo extends Observable {
ExampleOne one = new ExampleOne();
ExampleTwo two = new ExampleTwo();
two.addObserver(one)
在这种情况下,实例对象“两个”和“一个”之间的连接或类似静态情况的class.class,它看起来像实例,但不确定,如果这是观察者和观察者之间的连接然后观察如果“一个”或“两个”被垃圾收集或超出范围会发生什么?这会破坏观察者的设置。
这样的示例是当服务器从客户端接收String消息时,观察者用于在新文本消息到达时通知。如果其中一个实例变量超出范围并被垃圾收集,那么当消息到达时将不再有通知,因为系统将被破坏。这是对的吗?
答案 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,它保留对其元素的引用。