嗨我一直在尋找任何方式,如果Java可以檢測到變量是否已被修改,這可能嗎?我想使用一個計時器,這樣當變量被修改時,它將重置爲零並重新啓動。如果變量未修改爲20秒(即計時器達到20秒),它將執行類似打印變量的操作。檢測變量是否在XX秒內未被修改
修改指的是任何新的值賦值,如array[2] = 3
。
嗨我一直在尋找任何方式,如果Java可以檢測到變量是否已被修改,這可能嗎?我想使用一個計時器,這樣當變量被修改時,它將重置爲零並重新啓動。如果變量未修改爲20秒(即計時器達到20秒),它將執行類似打印變量的操作。檢測變量是否在XX秒內未被修改
修改指的是任何新的值賦值,如array[2] = 3
。
首先你需要用的get和set方法的領域,並使其private
。然後,你需要做的是它和每個set
調用更新時間戳:
public void setArray(int index, int value) {
array[index] = value;
lastModifiedTime = System.currentTimeMillis();
}
然後,您將需要監控一個單獨的線程中lastModifiedTime
如果System.currentTimeMillis() - lastModifiedTime > 20000
觸發事件。
顯然沒有內置的東西,你不想隱式地在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);
您需要包裝屬性才能創建定時重置。您可以將實現基於PropertyChangeSupport。
這可以工作,假設OP關心'array'被修改,而不是一個特定的索引。但這是正確的想法。 +1。 –