Недавно я прочитал о Java Observable классе. Я не понимаю, что: перед уведомлением наблюдателей (notifyObservers()) я должен вызвать setChanged(). Существует метод boolean внутри метода notifyObservers, который требует от нас вызова setChanged. Какова цель логического значения и почему я должен называть setChanged()?
Почему мне нужно вызвать setChanged, прежде чем я уведомлю наблюдателей?
Ответ 1
В длительном режиме вы можете несколько раз вызвать setChanged(), но в конце, только один раз notifyObservers(). Если до конца по внутренней причине вы решите откат, вы можете выбрать clearChanged(). В более позднем случае notifyObservers() не имеет эффекта.
Ответ 2
может быть установлена причина .Changed() имеет защищенный модификатор. Между тем notifyObservers() может быть вызван где угодно, даже наблюдателем. С этой точки зрения наблюдаемый и наблюдатель могут взаимодействовать друг с другом с помощью этого механизма.
Ответ 3
setchanged() используется как указание или флаг для изменения состояния. если это правда, notifyObservers() может запускать и обновлять все наблюдатели. Если он ошибочен, то notifyObservers() вызывается без вызова setchanged(), и наблюдатели не будут уведомлены.
Ответ 4
public void notifyObservers(Object arg) {
/*
* a temporary array buffer, used as a snapshot of the state of
* current Observers.
*/
Observer[] arrLocal;
synchronized (this) {
/* We don't want the Observer doing callbacks into
* arbitrary Observables while holding its own Monitor.
* The code where we extract each Observable from
* the ArrayList and store the state of the Observer
* needs synchronization, but notifying observers
* does not (should not). The worst result of any
* potential race-condition here is that:
*
* 1) a newly-added Observer will miss a
* notification in progress
* 2) a recently unregistered Observer will be
* wrongly notified when it doesn't care
*/
if (!hasChanged())
return;
arrLocal = observers.toArray(new Observer[observers.size()]);
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
arrLocal[i].update(this, arg);
}
Комментарий - причина