2012-01-12 14 views
-1

2つのBooleanオブジェクトを==で比較すると間違った答えが得られることに気づきました。Java Booleanクラスの比較

以下のテストコードを見てください。テストaとテストcでは、一貫した回答が得られます。

テストbが失敗します。 Boolean.TRUEへの参照を返す代わりに、新しいBoolean(true)が同じ値を持つ別のオブジェクトを作成できるようです。彼らはあなたがnewbを割り当てられているので、あなたが偽の取得メモリ内の同じオブジェクトである場合に

public static void main(String[] args) { 
    Boolean a = Boolean.TRUE; 
    Boolean b = new Boolean(true); 
    Boolean c = null; 
    boolean x = true; 
    boolean y = false; 

    System.out.println("Test a"); 
    System.out.println((a == Boolean.TRUE) ? "TRUE" : "FALSE"); 
    System.out.println((Boolean.TRUE.equals(a)) ? "TRUE" : "FALSE"); 
    System.out.println("Test b"); 
    System.out.println((b == Boolean.TRUE) ? "TRUE" : "FALSE"); 
    System.out.println((Boolean.TRUE.equals(b)) ? "TRUE" : "FALSE"); 
    System.out.println("Test c"); 
    System.out.println((c == Boolean.TRUE) ? "TRUE" : "FALSE"); 
    System.out.println((Boolean.TRUE.equals(c)) ? "TRUE" : "FALSE"); 

    /* OUTPUT is 
    Test a 
    TRUE 
    TRUE 
    Test b 
    FALSE 
    TRUE 
    Test c 
    FALSE 
    FALSE   
    */ 
} 
+2

何が質問ですか?それがJavaの仕組みです。 – skaffman

+1

それは本当です...だから何が問題なのですか? –

+0

おそらく、コンストラクタの呼び出しが何かを返すと思われる理由を調べてみてください。あるいは、もしあなたが 'Boolean'のためのパラメータ化されたコンストラクタを書くなら、' Boolean.TRUE'を返すためにそれを書くとどう思いますか? –

答えて

7

Booleanので、参照型と==テストです。