Наблюдаемый класс Java: clearChanged() и уведомляет наблюдателей… в каком порядке?

#java

#java

Вопрос:

Если мы посмотрим на JavaDoc для Observable notifyObservers() метода, мы прочитаем следующее:

«… затем уведомляет всех своих наблюдателей, а затем вызывает метод clearChanged, чтобы указать, что этот объект больше не изменился».

Это довольно однозначно (для меня). Происходит то, что мы уведомляем каждого зарегистрированного наблюдателя, а ЗАТЕМ clearChanged() вызывается метод. Однако в ходе моего тестирования я обнаружил, что clearChanged() вызывался метод, а ЗАТЕМ вызывались зарегистрированные наблюдатели. Порядок, который задокументирован, отличается от порядка того, что я, кажется, действительно вижу.

Затем я проверил источник для Observable и, похоже, обнаружил, что опытное поведение ( clearChanged() а ЗАТЕМ notified observables — это то, что должно произойти).

Учитывая, что этот класс существует со времен Java 1.1, я должен полагать, что я как-то неверен в своем предположении, что наблюдатели вызываются, а затем clearChanged() вызываются. Кто-нибудь может увидеть, где мое мышление неверно?

Ответ №1:

Ваша логика верна. Посмотрите на исходный код для 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 ()

Комментарии:

1. Привет, Дин, спасибо за ответ. Интересная вещь (для меня) заключается в том, что в моем решении я действительно хочу, чтобы clearChanged() вызывался ПОСЛЕ уведомлений, сделанных наблюдателям. Вот мое мышление… Я создал подкласс Observable, который содержит историю изменений, внесенных в этот наблюдаемый. Я хочу, чтобы эта история «очищалась», когда я знаю, что любой, кто интересуется этим, видел это. Следовательно, я переопределил clearChanged(), чтобы очистить историю, но она вызывается до того, как наблюдатели получат возможность просмотреть историю.

2. Эй, да, я думаю, что лучший способ изменить порядок их вызова на то, что вы хотите, — это расширить класс. Однако вместо переопределения clearChanged я предлагаю вам переопределить notifyObserver(объект o) и изменить порядок