不断检查Java的变化?

use*_*671 5 java methods boolean

如何检查布尔值以在给定的时间段内更改状态,如果在该时间段内进行了更改,请执行方法?

可以用Java给出任何帮助.

谢谢.

aio*_*obe 15

听起来你想在一个类中包含一个布尔值,你可以监听它的变化.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后简单地做:

ObservableBoolean b = new ObservableBoolean();

//...

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

// ...

// End the "period of time":
b.removeChangeListener(iWantToBeNotifiedOfChanges);
Run Code Online (Sandbox Code Playgroud)

这实际上是MVC模式(和观察者模式)的简单情况.在这种情况下,模型是ObservableBoolean,视图将是想要通知更改的"视图".

ChangeListener如果你想避免一个奇怪的javax.swing...导入,你也可以编写自己的界面

  • @aioobe:我认为你不应该在保持同步锁的同时通知你.你不知道谁会注册因此你基本上正在进行所谓的"外来方法调用".永远不要在持有同步锁的同时制作外来方法. (2认同)

Mic*_*yan 6

最简单的方法是使用包装类...

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);
}
Run Code Online (Sandbox Code Playgroud)

这是Swing中的常见模式,您可以使用PropertyChangeSupport来简化对象的创建,您可以在其上观察和侦听属性更改.使用这些类,您可以注册一个PropertyChangeListener来处理结果的PropertyChangeEvent.