2011-03-23 137 views
8

我發現自己想要在我的程序中做某些事情,只有當變量發生了變化。我到目前爲止一直在做這樣的事情:如何檢測變量是否發生了變化?

int x = 1; 
int initialx = x; 

...//code that may or may not change the value of x 

if (x!=initialx){ 
    doOneTimeTaskIfVariableHasChanged(); 
    initialx = x; //reset initialx for future change tests 
} 

有沒有更好/更簡單的方法來做到這一點?

+0

作爲參考,我發現這個相關的(雖然不好問)的問題:http://stackoverflow.com/q/3051114/431327 – Amplify91 2011-03-23 06:22:03

+1

沒有沒有簡單的。你可能想把你的代碼放在一個x對象存在的對象中,'if(x!= initialx){...}'是這個對象的一個​​方法。但是這可能最終會變得更加複雜。 – 2011-03-23 06:22:47

+0

但是,只有在執行腳本時纔會確定,在執行腳本之前,變量可能會更改值。此外,JavaScript不支持多線程,Java是不同的情況下 – 2011-03-23 06:24:17

回答

5

既然你希望找到並執行一些動作只有當值改變,我會的setXXX去,例如:

public class X 
{ 
    private int x = 1; 

    //some other code here 

    public void setX(int proposedValueForX) 
    { 
     if(proposedValueForX != x) 
     { 
      doOneTimeTaskIfVariableHasChanged(); 
      x = proposedValueForX; 
     } 
    } 
} 
4

您可以使用帶有與每個字段關聯的髒位的getter/setter。如果值通過setter更改,並強制用戶使用setter,則將其標記爲髒髒

+0

你能解釋一下嗎?這聽起來很有趣,但我是編程新手,我以前沒有用過髒位。我相信遇到這個問題的其他人也會讚賞它! – Amplify91 2011-03-26 08:42:22

+0

這很簡單,它會在你正在觀看的東西上進行一些修改。 – 2011-03-28 06:12:39

0

您也可以使用標誌概念,就像改變x的值一樣。爲布爾變量賦值true。保持默認值爲false的布爾值。 用這種方法檢查。

這種方式比以性能爲基礎的getter和setter更好,而不是有兩個方法getter和setter的縮減代碼。

0

假設你有多個線程,你可以創建一個對象,監測和等待改變對象來喚醒所有被阻塞的線程。

事情是這樣的:

private MyObject myObject; 

... other thread ... 
while(true) { 
    myObject.wait() 
    logic you want to run when notified. 
} 
... other thread ... 

... later on ... 

myObject.change(); 
myObject.notifyAll(); 
2

例子:

創建一個變量與一個數字同名。

int var1; 
int var2; 

if(var1 != var2) 
{ 
//do the code here 

var2 = var1; 
} 

希望得到這個幫助。

相關問題