Java Boolean.TRUE==someMethod(),其中返回类型为Boolean for someMethod(),并返回一个文本TRUE
请看下面的节目:-Java Boolean.TRUE==someMethod(),其中返回类型为Boolean for someMethod(),并返回一个文本TRUE,java,hibernate,boolean,core,boolean-expression,Java,Hibernate,Boolean,Core,Boolean Expression,请看下面的节目:- class Main { public static void main(String[] args) { System.out.println(Boolean.TRUE == new Main().getBoolean()); } public Boolean getBoolean() { return true; } } 如果我检查Java助记符,我会得到:- Compiled from "Main.java" class com.t
class Main {
public static void main(String[] args) {
System.out.println(Boolean.TRUE == new Main().getBoolean());
}
public Boolean getBoolean() {
return true;
}
}
如果我检查Java助记符,我会得到:-
Compiled from "Main.java"
class com.testing.Main {
com.testing.Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: getstatic #3 // Field java/lang/Boolean.TRUE:Ljava/lang/Boolean;
6: new #4 // class com/testing/Main
9: dup
10: invokespecial #5 // Method "<init>":()V
13: invokevirtual #6 // Method getBoolean:()Ljava/lang/Boolean;
16: if_acmpne 23
19: iconst_1
20: goto 24
23: iconst_0
24: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V
27: return
public java.lang.Boolean getBoolean();
Code:
0: iconst_1
1: invokestatic #8 // Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
4: areturn
}
从“Main.java”编译而来
类com.testing.Main{
Main();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:getstatic#2//Field java/lang/System.out:Ljava/io/PrintStream;
3:getstatic#3//字段java/lang/Boolean.TRUE:Ljava/lang/Boolean;
6:新的#4//class com/testing/Main
9:dup
10:invokespecial#5//方法“”:()V
13:invokevirtual#6//方法getBoolean:()Ljava/lang/Boolean;
16:if_acmpne 23
19:iconst_1
20:转到24
23:iconst_0
24:invokevirtual#7//方法java/io/PrintStream.println:(Z)V
27:返回
public java.lang.Boolean getBoolean();
代码:
0:iconst_1
1:invokestatic#8//方法java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
4:轮到你了
}
因此,在Java助记符中:
对于最后一个方法的第0行和第1行,即getBoolean()方法
,
我们看到自动装箱正在发生,即iconst_1
即int 1
(此处表示“true”)(在第0行)被传递给Boolean.valueOf()
方法(在第1行)。和
Java.Lang
中的Boolean.valueOf(Boolean b)
方法,返回一个常量Boolean.TRUE
或Boolean.FALSE
因此,在程序main
方法中,==
检查应始终正常工作,
或者在Java助记符中:第16行。但在某些环境中,我认为这是错误的。 怎么可能呢 编辑:这里,在我的例子中,准确地说:Hibernate从 将DB和集合设置为布尔字段。这个布尔字段有一个getter, 这是我上面程序中的
getBoolean()
除非我忽略了这里显而易见的内容,否则这是完全可能的,并且取决于
getBoolean
返回的内容:
public static Boolean getBoolean() {
return new Boolean(true);
}
Boolean aha = Boolean.TRUE;
Boolean aha2 = getBoolean();
System.out.println(aha == aha2); // false
但是在比较
Boolean
s时,显然必须使用thanBoolean::equals
您的代码运行在什么样的环境中?是否涉及多个类加载器?根据javadocBoolean.valueOf()
返回Boolean.TRUE
或Boolean.FALSE
。因此,除非您的jvm实现中有一个bug或者类加载器层次结构真的不完整,否则导致false
的情况是不可能发生的。(更可能的是,Boolean
给你的false
是用new Boolean(Boolean)
创建的)@k5_u我更担心的是,布尔值没有以某种方式被保存,所以对象比较就接管了。另外,从方法获取的布尔值正在被获取,从MySQL中表中的位列。特定SQL类型位的Java类型为Java.lang.Boolean。Hibernate正在获取此数据。那么它可能是Hibernate错误(即Hibernate不使用@k5_uuu2;said之类的常量),但最好不要首先使用=
来比较对象。是的,更正一个新的布尔值(布尔值)将使其为false。这是我能假设的唯一情况,这是可能发生的。但是,hibernate是否从数据库中提取位,并返回一个新的布尔值(bitValue)?@AayushShrivastava为什么不找出答案,发布一个答案,如果找到了(并且在以后的版本中没有修复),则向hibernate开发人员报告一个错误。当然,如果是Boolean.TRUE==getBoolean()
,您不需要使用equals
,您可以简单地使用true==getBoolean()
,或者更好地使用getBoolean()
。