Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 值更改时要运行的函数_Java_Variables_Onchange - Fatal编程技术网

Java 值更改时要运行的函数

Java 值更改时要运行的函数,java,variables,onchange,Java,Variables,Onchange,在发现我不能自动装箱自己的类型后,我仍然需要一个在赋值时自动调整的值。这会起作用吗,还是干脆冻结?如果不行,我们将不胜感激 while(true){ if(x){ y=z } } 注:如果我能更好地解释我的课程,可能会有所帮助,因此: 它本质上与整数相同,但它需要一个最大值和一个最小值。我需要这样,当它的值>max时,它从min开始,反之亦然。 例如: 基本上,它是可配置的,并且至少未使用可配置的max对其进行签名。我看不到循环的任何终止条件,因此它将继续循环。

在发现我不能自动装箱自己的类型后,我仍然需要一个在赋值时自动调整的值。这会起作用吗,还是干脆冻结?如果不行,我们将不胜感激

while(true){
    if(x){
        y=z
    }
}
注:如果我能更好地解释我的课程,可能会有所帮助,因此: 它本质上与整数相同,但它需要一个最大值和一个最小值。我需要这样,当它的值>max时,它从min开始,反之亦然。 例如:


基本上,它是可配置的,并且至少未使用可配置的max对其进行签名。

我看不到循环的任何终止条件,因此它将继续循环。我认为您可以执行以下两种操作之一:

  • 使用
    中断

     while(true){
       if(x){
          y=z;
          break;
       }
    }
    
  • 使用状态标志:

     boolean found = false;
     while(!found){
       if(x){
          y=z;
          found = true;
       }
    }
    

  • 我还建议在循环中设置一些时间间隔,例如100毫秒(Thread.sleep(100));否则它将连续循环单元
    x
    条件满足。

    好吧,如果它是这样写的,你可以做类似的工作(某种程度上):

    volatile boolean x;
    ...
    while (true) {
       if (x) {
           y = z;
           break;
       }
    }
    
    (请注意,您需要将
    x
    声明为volatile,或者对此线程使用
    synchronized
    同步,以可靠地查看另一个线程对
    x
    的更新。)

    然而,这是一种糟糕的实现方式。本质上,线程将持续执行该循环,直到
    x
    设置为
    true
    。这将占用大量系统内存带宽来限制一个内核。。。并耗尽机器的电池

    更好的方法是将
    x
    设为私有,并编写其setter,以便在变量更新时通知另一个线程


    或者更好的方法是,使用事件/事件监听器或
    java.util.concurrent
    类之一实现您试图执行的任何操作。(很难建议哪一个是最好的,因为你的例子太做作了…

    “…不能自动装箱我自己的类型”,你是什么意思?还有这个“…赋值时自动调整自身的值。”。自动装箱就像使用UserDefinedClass=val而不是UserDefinedClass=new UserDefinedClass(val)一样,我认为这会允许我重载“=”,但java不支持。如果我使用它,我对如何为变量更改创建事件侦听器有点困惑。@user1825860-你误解了。通过调用setter进行变量更改。setter注意到变量实际上已经更改,并调用侦听器的回调来告诉litener“variable has change”事件已经发生。这种方法要求只通过调用setter方法来更改变量。。。
    volatile boolean x;
    ...
    while (true) {
       if (x) {
           y = z;
           break;
       }
    }