如果我们查看Observable
notifyObservers()
方法的JavaDoc,我们会阅读以下内容:
" ...然后通知所有观察者,然后调用clearChanged方法指示此对象已不再更改。"
这对我来说非常明确(对我而言)。发生的情况是我们通知每个注册的观察者并且那么调用了clearChanged()
方法。但是,在我的测试中,我发现的是调用clearChanged()
方法并且那么正在调用已注册的观察者。记录的顺序与我实际看到的顺序相反。
然后我检查了Observable的来源,似乎发现经验丰富的行为(clearChanged()
和 THEN 通知的可观察对象是编码发生的事情。)
鉴于这个类自Java 1.1以来一直存在,我必须相信我在假设观察者被调用然后clearChanged()
被调用时不正确。任何人都可以看到我的想法不正确吗?
答案 0 :(得分:3)
你的逻辑是正确的。查看Observable的源代码:
public void notifyObservers() {
notifyObservers(null);
}
和
public void notifyObservers(Object arg) {
/*
* a temporary array buffer, used as a snapshot of the state of
* current Observers.
*/
Object[] arrLocal;
synchronized (this) {
if (!changed)
return;
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
您所描述的正是发生的事情 - 在更新所有内容之前调用clearChanged()。
可能只是Java Docs中的一个错字 - 找到它的好工作;)
编辑:来自http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html#notifyObservers()的代码