2017-02-14 12 views
-1

別のオブジェクトのブール値が真であるかどうかをチェックする方法が必要です。その場合にのみ何かを行う必要があります。だから、この場合、参照によって値を渡す方法は?

、私は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ループに残っていることです。どうして ?

答えて

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

'test'も' volatile'にする必要があります。 – 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 

    } 

} 
関連する問題