2011-03-23 124 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; 
} 

希望得到这个帮助。

相关问题