0

HiberSAP プロジェクトのコード( BooleanConverter Linenumber 75)で非常に奇妙な動作に気付きました。

問題は、ブール値が「X」に変換されないことです。コードをデバッグし、ブール式を調べましたjavaValue == Boolean.TRUEBoolean.TRUEjavaValueの ID は 36 で、Boolean.TRUE の ID は 33 であるため、この式は false と解釈されます(ID は Eclipse IDE の変数ビューに表示されます)。Boolean のすべてのインスタンスを調べることもできます。実際、java.lang.Boolean のインスタンスが 4 つあります。

誰かが私になぜこれが起こっているのか説明してもらえますか.


編集:

わかりました、私の質問は十分に正確ではないと思います。変換する必要があるフィールドはブール値であり、 java.lang.Booleanではありません。これは Classloader Fault である必要があります。私の場合、ブール値からブール値への唯一の変換は JVM によって行われます。すべてのオブジェクト比較で .equals() を使用する必要があることはわかっています (そしてバグを埋めます) が、この場合はそのまま機能するはずです。次のコードを参照してください。

public static void main(String[] args) {
    for(int i = 0; i < 1000; i++){
        print(true);
    }

}

public static void print(Object value) {
    System.out.println(value);
}

これにより、1000 個の java.lang.Boolean インスタンスが作成されることはありません。これは常にjava.lang.Boolean.TRUE を使用する必要があります! そして、これは私が理解できなかったコードの奇妙な動作です。

これは、Hibersap によって行われるリフレクションの副作用でしょうか? しかし、これがそのような行動の理由であってはならないと思います。

どうか、理解したいだけです。

4

1 に答える 1

3

new Boolean(true)またはを実行するたびnew Boolean(false)に、ブール値の新しいインスタンスを作成します。これは、定義上、他のインスタンスとは異なります。列挙型を除くオブジェクトは、 と比較しないでください==.equals()代わりに使用してください。または、あなたの場合、使用しますjavaValue.booleanValue()

于 2013-04-05T09:31:44.353 に答える