如果我们在JavaDoc中查找Observable
notifyObservers()
方法,则会读取以下内容:
“...然后通知其所有观察者,然后调用clearChanged方法以指示该对象不再更改。”
(对我而言)这是明确的。发生的事情是,我们通知每个注册的观察者,然后然后调用了clearChanged()
方法。但是,在测试中,我发现正在调用clearChanged()
方法,并且正在调用然后注册的观察者。记录的顺序与我实际看到的顺序相反。
然后,我检查了Observable的来源,似乎发现了有经验的行为(clearChanged()
和 THEN 通知了observables是编码发生的事情)。
鉴于该类自Java 1.1开始就存在,因此我必须以为先调用观察者然后再调用clearChanged()
的假设是不正确的。谁能看到我的想法不正确?
最佳答案
您的逻辑是正确的。查看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()中的代码