在这种情况下如何通过引用传递值?

时间:2017-02-14 19:38:24

标签: java

我需要一种方法来检查另一个对象的布尔值是否为真,并且只有在这种情况下应该做某事。

所以,我有两个班级:

public class A{
   private boolean test = false;
   ...
   ...

   public boolean returnTest(){ return test; }
}




public class B{
   private boolean abcd;

   public B(A myA){
      this.abcd = myA.returnTest();
   }

   public void test(){
      while(!abcd){
         // wait
      }
      // do something

   }

}

问题是即使对象 A 测试值变为 true ,它仍会永远保留在while循环中。为什么?

5 个答案:

答案 0 :(得分:1)

在您的情况下,将实例传递给函数test()更好,通过传递test()实例调用A。每次创建A的新实例或现有实例更新其属性时,请将其传递给test()

   public void test(A a){
        while(!a.returnTest()){
            // wait            
        }
    }

答案 1 :(得分:0)

test()更改为while (!myA.returnTest())没有其他替代方法。如果将结果存储在变量中,它将永久保留。 (对象的属性或方法调用可以反映其他地方的变化,但变量本身不能。)

答案 2 :(得分:0)

布尔值是不可变的,所以你不能复制它们的引用。

相反,请尝试:

public class B{
   private A a;

   public B(A myA){
      this.a= myA();
   }

   public void test(){
      while(!myA.returnTest()){
         // wait
      }
      // do something

   }
}

答案 3 :(得分:0)

如果必须这样做,一个选项是使用java.util.concurrent.atomic.AtomicBoolean,这是一种可变类型。您可以分别使用get()set(boolean)检索和更新值。如果线程安全可能成为您应用程序中的一个问题,那么这也是一个不错的选择。

否则,您必须存储对A实例的引用,并使用其中的标志而不是检查其他变量。

答案 4 :(得分:0)

在Java 8中,您可以使用方法引用。

public class A{
   private boolean test = false;
   ...
   ...

   public boolean returnTest(){ return test; }
}




public class B{
   private BooleanSupplier abcd;

   public B(A myA){
      this.abcd = myA::returnTest; // a reference to this method.
   }

   public void test(){
      while(!abcd.getAsBoolean()) { // calls the method each time.
         // wait
      }
      // do something

   }

}