0

我注意到HiberSAP 项目的代码(BooleanConverter Linenumber 75)中有一个非常奇怪的行为。

问题是布尔值没有转换为“X”。我已经调试了代码并检查了布尔表达式javaValue == Boolean.TRUE。此表达式被解释为 false,因为 javaValueBoolean.TRUE的 ID 为 36,而 Boolean.TRUE 的 ID 为 33(该 ID 显示在 Eclipse IDE 的变量视图中)。我还可以检查所有布尔实例,实际上,有四个 java.lang.Boolean 实例!

有人可以解释一下为什么会这样。


编辑:

好的,我认为我的问题不够精确。应该转换的字段是boolean而不是java.lang.Boolean。这一定是一个类加载器错误。在我的情况下,从布尔值到布尔值的唯一转换是由 JVM 完成的。我知道每个 Object 比较都应该使用 .equals() (并且我填写了一个 Bug),但在这种情况下它应该按原样工作。请参阅以下代码:

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

Each time you're doing new Boolean(true) or new Boolean(false), you create a new instance of Boolean, which is, by definition, different from other instances. Objects, except enums, should never be compared with ==. Use .equals() instead. Or, in your case, use javaValue.booleanValue().

于 2013-04-05T09:31:44.353 回答