【问题标题】:How to detect if a variable has changed?如何检测变量是否已更改?
【发布时间】:2011-03-23 06:18:57
【问题描述】:

我发现只有当变量发生变化时,我才想在我的程序中做某些事情。到目前为止,我一直在做这样的事情:

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
}  

有更好/更简单的方法吗?

【问题讨论】:

  • 作为参考,我发现了这个相关(虽然问得不好)的问题:stackoverflow.com/q/3051114/431327
  • 没有。没有更简单的了。您可能希望将代码包装在一个对象中,其中 x 位于对象内部,if(x!=initialx){...} 是该对象的一个​​方法。但这可能最终看起来更复杂。
  • 但这将仅决定何时执行脚本,变量可能会在执行此脚本之前更改值。 javascript也不支持多线程,java是不同的情况
  • @ypercube 这正是我迄今为止所做的。只是我一直在自学如何编程,有时我想知道我可能错过了 CS101 教科书第 1 章中的哪些基础知识或一般概念。感谢您的快速回复!
  • 另外我想提出类似How to fire event if a variable changes ..lol 的问题。

标签: java


【解决方案1】:

由于您只想在值更改时查找并执行某些操作,因此我会使用 setXXX,例如:

public class X
{
    private int x = 1;

    //some other code here

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

【讨论】:

    【解决方案2】:

    您可以将 getter/setter 与每个字段关联的脏位一起使用。如果通过 setter 更改值,则将其标记为脏,并强制用户使用 setter

    【讨论】:

    • 你能再解释一下吗?这听起来很有趣,但我是编程新手,以前没有使用过脏位。我相信遇到这个问题的其他人也会很感激!
    • 这有点简单,它会根据您正在观看的内容进行一些修改。
    【解决方案3】:

    另一种方法是使用AOP来拦截字段的变化,例如AspectJ,你可以看看http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html

    【讨论】:

      【解决方案4】:

      例子:

      创建一个带有数字的同名变量。

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

      希望对您有所帮助。

      【讨论】:

        【解决方案5】:

        你也可以使用标志概念,就像改变 x 的值一样。为布尔变量分配 true。保持布尔值,默认值为 false。 通过这种方式检查。

        这种方式比在性能基础上使用 getter 和 setter 更好,不会有 getter 和 setter 两种方法的冗余代码。

        【讨论】:

          【解决方案6】:

          假设您有多个线程,您可以创建一个对象监视器并等待更改的对象唤醒所有阻塞的线程。

          类似这样的:

          private MyObject myObject;
          
          ... other thread ...
          while(true) {
            myObject.wait()
            logic you want to run when notified.
          }
          ... other thread ...
          
          ... later on ...
          
          myObject.change();
          myObject.notifyAll();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-01-21
            • 2020-08-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多