可观察的Java类:clearChanged()并通知观察者。。。什么订单?
如果我们查看JavaDoc中的可观察的Java类:clearChanged()并通知观察者。。。什么订单?,java,Java,如果我们查看JavaDoc中的Observablenotifyobservators()方法,我们会看到以下内容: “…然后通知其所有观察者,然后调用clearChanged方法以指示此对象已不再更改。” (对我来说)这是相当明确的。我们通知每个注册的观察者,然后调用clearChanged()方法。然而,在我的测试中,我发现调用了clearChanged()方法,然后调用了注册的观察者。记录的顺序与我实际看到的顺序相反 然后我检查了可观察的源代码,似乎发现有经验的行为(clearChanged
Observable
notifyobservators()
方法,我们会看到以下内容:
“…然后通知其所有观察者,然后调用clearChanged方法以指示此对象已不再更改。”
(对我来说)这是相当明确的。我们通知每个注册的观察者,然后调用clearChanged()
方法。然而,在我的测试中,我发现调用了clearChanged()
方法,然后调用了注册的观察者。记录的顺序与我实际看到的顺序相反
然后我检查了可观察的源代码,似乎发现有经验的行为(clearChanged()
和then通知的可观察是编码要发生的)
考虑到这个类从Java1.1开始就存在,我必须相信我的假设是不正确的,即调用了观察器,然后调用了
clearChanged()
。有人能看出我的想法哪里不正确吗?你的逻辑是正确的。查看源代码以了解可观察性:
public void notifyObservers() {
notifyObservers(null);
}
及
您所描述的正是发生的情况—在所有内容更新之前调用clearChanged()
可能只是Java文档中的一个输入错误——找到它很好;)
编辑:代码来自嗨,迪安,谢谢你的回复。(对我来说)有趣的是,在我的解决方案中,我实际上希望在向观察者发出通知后调用clearChanged()。这是我的想法。。。我创建了一个子类Observable,其中包含对该Observable所做更改的历史记录。当我知道任何对它感兴趣的人都看过它时,我希望这段历史被“清除”。因此,我重写了clearChanged()以清除历史记录,但它是在观察者有机会看到历史记录之前被调用的。嘿,是的,我认为将调用顺序切换到您想要的顺序的最佳方法是扩展该类。但是,我建议您不要覆盖clearChanged,而是覆盖notifyObserver(对象o),并翻转顺序
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);
}