我发现自己只有在变量发生变化时才想在我的程序中做某些事情。到目前为止,我一直在做这样的事情:
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 :(得分:6)
由于您只想在值发生变化时查找并执行某些操作,我会使用setXXX,例如:
public class X
{
private int x = 1;
//some other code here
public void setX(int proposedValueForX)
{
if(proposedValueForX != x)
{
doOneTimeTaskIfVariableHasChanged();
x = proposedValueForX;
}
}
}
答案 1 :(得分:4)
您可以将getter / setter与每个字段关联的脏位一起使用。如果通过setter更改值,则将其标记为脏,并强制用户使用setter
答案 2 :(得分:4)
另一种方法是使用AOP拦截字段的更改,例如,AspectJ,你可以看看http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html
答案 3 :(得分:2)
示例:
使用相同的名称创建一个带有数字的变量。
int var1;
int var2;
if(var1 != var2)
{
//do the code here
var2 = var1;
}
希望这有帮助。
答案 4 :(得分:0)
你也可以使用标志概念,就像改变x的值一样。为布尔变量赋值true。保持布尔值,默认值为false。 通过这种方式检查。
这种方法比基于性能的getter和setter更好,而不是使用两个方法getter和setter的reduntant代码。
答案 5 :(得分: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();