2017-02-14 37 views
-1

我需要一種方法來檢查另一個對象的布爾值是否爲true,並且只有在這種情況下才應該執行某些操作。如何在這種情況下通過引用傳遞價值?

所以,我有2類:

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 

    } 

} 

的問題是,它留在while循環永遠即使對象測試值A成爲真正。爲什麼?

回答

0

沒有真正的替代test()while (!myA.returnTest())。如果將結果存儲在變量中,它將永久保留。 (屬性對象或方法調用可以反映其他地方的更改,但變量本身不能)

+0

我應該傳遞整個對象A嗎? – xRobot

+0

是的,基本上。 –

0

布爾值是不可變的,因此您無法對其進行引用的副本。

相反,嘗試:

public class B{ 
    private A a; 

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

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

    } 
} 
+0

對象是通過引用存儲的嗎? – xRobot

+0

Yup對象通過引用存儲。 'boolean'是一個基元,而不是一個對象。如果你使用'Boolean',它也不會起作用,因爲它也是不可變的。不過你可以使用['AtomicBoolean'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html)。 –

1

在你的情況,通過實例功能測試()是更好的,有路過的A實例調用test()。每次創建的A一個新實例或現有實例已經更新了它的屬性,它傳遞給test()

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

'測試'也需要'易失性'。 – shmosel

0

如果你必須這樣做,一個選擇是使用一個java.util.concurrent.atomic.AtomicBoolean,這是可變類型。您可以分別使用get()set(boolean)檢索和更新值。如果線程安全可能成爲應用程序中的一個問題,那麼這也是一個不錯的選擇。

否則,您必須存儲對A實例的引用,並使用其中的標誌而不是檢查其他變量。

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 

    } 

}