您好我一直在寻找Java可以检测变量是否被修改的方法,这可能吗?我想使用一个计时器,以便在修改变量时它将重置为零并重新启动。如果变量在20秒内未经修改(即计时器达到20秒),它将执行类似打印变量的操作。
修改是指任何新的值分配,例如array[2] = 3
。
答案 0 :(得分:2)
显然没有任何内置功能,您不希望在Java中的每个变量旁边隐式存储一些时间戳。您可以做的是将变量包装在某个对象中,封装修改并在每次发生突变时启动计时器。
public class ListeningRef<T> {
private final ScheduledExecutorService timersPool;
private T value;
private ScheduledFuture<?> timer;
public ListeningRef(ScheduledExecutorService timersPool, T value) {
this.timersPool = timersPool;
this.value = value;
}
public T get() {
return value;
}
public void set(final T value) {
this.value = value;
scheduleTimer();
}
private void scheduleTimer() {
if (timer != null) {
timer.cancel(true);
}
timer = timersPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("Not modified in 20 seconds: " + ListeningRef.this.value);
}
}, 20, TimeUnit.SECONDS);
}
}
这是您使用它的方式:
final ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);
final ListeningRef<String> listeningRef = new ListeningRef<String>(pool, "Hi!");
TimeUnit.SECONDS.sleep(19);
System.out.println(listeningRef.get());
listeningRef.set("Bye!");
TimeUnit.SECONDS.sleep(21);
答案 1 :(得分:2)
首先,您需要将该字段包装在get和set方法中,并将其设为private
。然后,您需要创建一个时间戳,该时间戳随每次set
调用而更新:
public void setArray(int index, int value) {
array[index] = value;
lastModifiedTime = System.currentTimeMillis();
}
然后,您需要在单独的线程中监控lastModifiedTime
,并在System.currentTimeMillis() - lastModifiedTime > 20000
时触发事件。
答案 2 :(得分:1)
您需要包装属性以创建定时重置。您可以将实施基于PropertyChangeSupport。