我注意到HiberSAP Project(BooleanConverter Linenumber 75)的代码中存在一种非常奇怪的行为。
问题是布尔值不会转换为'X'。我调试了代码并检查了布尔表达式javaValue == Boolean.TRUE
。此表达式被解释为false,因为javaValue为Boolean.TRUE
且ID为36且Boolean.TRUE具有ID 33(该ID显示在Eclipse IDE的Variables-View中)。我也可以检查所有布尔实例,实际上,有四个java.lang.Boolean实例!!
有人可以解释一下为什么会发生这种情况。
好的,我认为我的问题不够准确。应转换的字段是布尔而不是 java.lang.Boolean 。这必须是Classloader Fault。在我的例子中,从布尔到布尔的唯一转换是由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);
}
这应该 NOT 创建1000个java.lang.Boolean实例。这应该始终使用java.lang.Boolean.TRUE!这是我无法理解的守则的奇怪行为。
也许这是Hibersap所做反射的副作用?但我认为这不应成为这种行为的原因。
拜托,我只想了解。
答案 0 :(得分:3)
每次执行new Boolean(true)
或new Boolean(false)
时,都会创建一个新的Boolean实例,根据定义,它与其他实例不同。除了枚举之外,永远不应将对象与==
进行比较。请改用.equals()
。或者,在您的情况下,请使用javaValue.booleanValue()
。