#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) и изменить порядок