Постоянно проверять изменения в Java? - PullRequest
5 голосов
/ 30 апреля 2010

Как я могу проверить, чтобы логическое значение изменяло состояние в течение заданного периода времени, и если изменение было сделано в течение этого периода времени, выполните метод?

Может ли какая-либо помощь быть предоставлена ​​на Java.

Спасибо.

Ответы [ 4 ]

15 голосов
/ 30 апреля 2010

Звучит так, будто вы хотите заключить логическое значение в класс, в котором вы можете прослушивать изменения.

class ObservableBoolean {

    // "CopyOnWrite" to avoid concurrent modification exceptions in loop below.
    private final List<ChangeListener> listeners =
            new CopyOnWriteArrayList<ChangeListener>();

    private boolean value;

    public boolean getValue() {
        return value;
    }

    public synchronized void setValue(boolean b) {
        value = b;
        for (ChangeListener cl : listeners)
            cl.stateChanged(new ChangeEvent(this));
    }

    public synchronized void addChangeListener(ChangeListener cl) {
        listeners.add(cl);
    }

    public synchronized void removeChangeListener(ChangeListener cl) {
        listeners.remove(cl);
    }
}

Тогда просто сделайте:

ObservableBoolean b = new ObservableBoolean();

//...

// Start the "period of time":
b.addChangeListener(iWantToBeNotifiedOfChanges);

// ...

// End the "period of time":
b.removeChangeListener(iWantToBeNotifiedOfChanges);

На самом деле это простой случай шаблона MVC (и шаблона наблюдателя). Модель в этом случае - ObservableBoolean, а представление - это «представление», которое хочет получать уведомления об изменениях.

Вы также можете написать свой собственный ChangeListener интерфейс, если хотите избежать странного вида javax.swing... import

6 голосов
/ 30 апреля 2010

Самый простой способ сделать это с помощью класса-обёртки ...

public class Bool
{
    public Bool(){ _val = false; }
    public Bool(boolean val) { _val = val; }

    public boolean getValue(){ return _val; }
    public void setValue(boolean val){ 
         _changesupport.firePropertyChange("value",_val,_val=val);
    }

    public void addPropertyChangeListener(PropertyChangeListener listener ){
        _changesupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener){
        _changesupport.removePropertyChangeListener( listener );
    }

    private boolean _val = false;
    private final PropertyChangeSupport _changesupport = new PropertyChangeSupport(this);
}

Это обычный шаблон в Swing, и вы можете использовать PropertyChangeSupport , чтобы упростить создание объектов, на которых вы можете наблюдать и прослушивать изменения свойств. С такими классами вы можете зарегистрировать PropertyChangeListener для обработки результирующих PropertyChangeEvent с этим результатом.

1 голос
/ 30 апреля 2010

используйте Timer или напишите свой собственный класс, расширяющий Thread.

Погуглите эти вещи, чтобы дать вам хороший старт

edit: Из вопроса не совсем понятно, каковы его намерения. Может быть, он хочет вызвать какой-то метод в точный промежуток времени, а не сразу после события. Для этого паттерна я все же предпочел бы придерживаться таймера или написать свой собственный поток. Написание собственного потока все еще является лучшим способом интерпретации конкретных требований пользователя. С другой стороны, если это действительно случай прослушивания событий, мой шаблон таймера будет полностью неверным.

пример: я хочу обновлять базу данных (представьте игру в веб-браузере) каждые 5 минут, если пользователи этого требуют (request = true) С ложным запросом мне не нужно обновлять базу данных. Немедленное обновление базы данных (например, статистика в игре Tribal Wars с тысячами игроков) полностью излишне.

0 голосов
/ 30 апреля 2010

Похоже, вы должны выглядеть, чтобы реализовать что-то вроде Model View Controller Pattern. Взгляните здесь

Основная идея состоит в том, что вы должны запустить событие, когда логическое значение изменяется, и затем это событие запускается, ваш слушатель должен обработать это.

...