可观察的Java类:clearChanged()并通知观察者......什么顺序?

时间:2014-06-17 01:12:48

标签: java

如果我们查看Observable notifyObservers()方法的JavaDoc,我们会阅读以下内容:

" ...然后通知所有观察者,然后调用clearChanged方法指示此对象已不再更改。"

这对我来说非常明确(对我而言)。发生的情况是我们通知每个注册的观察者并且那么调用了clearChanged()方法。但是,在我的测试中,我发现的是调用clearChanged()方法并且那么正在调用已注册的观察者。记录的顺序与我实际看到的顺序相反。

然后我检查了Observable的来源,似乎发现经验丰富的行为(clearChanged() THEN 通知的可观察对象是编码发生的事情。)

鉴于这个类自Java 1.1以来一直存在,我必须相信我在假设观察者被调用然后clearChanged()被调用时不正确。任何人都可以看到我的想法不正确吗?

1 个答案:

答案 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()的代码