我需要一种方法来检查另一个对象的布尔值是否为真,并且只有在这种情况下应该做某事。
所以,我有两个班级:
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循环中。为什么?
答案 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
}
}