Подтвердить что ты не робот

Почему мне нужно вызвать setChanged, прежде чем я уведомлю наблюдателей?

Недавно я прочитал о Java Observable классе. Я не понимаю, что: перед уведомлением наблюдателей (notifyObservers()) я должен вызвать setChanged(). Существует метод boolean внутри метода notifyObservers, который требует от нас вызова setChanged. Какова цель логического значения и почему я должен называть setChanged()?

4b9b3361

Ответ 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);
}

Комментарий - причина