Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可观察的Java类:clearChanged()并通知观察者。。。什么订单?_Java - Fatal编程技术网

可观察的Java类:clearChanged()并通知观察者。。。什么订单?

可观察的Java类:clearChanged()并通知观察者。。。什么订单?,java,Java,如果我们查看JavaDoc中的Observablenotifyobservators()方法,我们会看到以下内容: “…然后通知其所有观察者,然后调用clearChanged方法以指示此对象已不再更改。” (对我来说)这是相当明确的。我们通知每个注册的观察者,然后调用clearChanged()方法。然而,在我的测试中,我发现调用了clearChanged()方法,然后调用了注册的观察者。记录的顺序与我实际看到的顺序相反 然后我检查了可观察的源代码,似乎发现有经验的行为(clearChanged

如果我们查看JavaDoc中的
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);
}