如果我们在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()中的代码

07-24 20:17