Boolean.TRUE == someMethod(),对于someMethod(),返回类型为Boolean,并且返回原义为true

时间:2018-08-23 10:52:07

标签: 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.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
}

因此,在Java助记符中: 行号最后一个方法的0和1,即getBoolean() method, 我们看到自动装箱正在发生,即iconst_1int 1(在这里是“ true”)(在第0行)被传递到Boolean.valueOf()方法(在第1行)。 > 并且Boolean.valueOf(boolean b)中的Java.Lang方法返回常量Boolean.TRUEBoolean.FALSE

因此,==检查应始终可以在程序main方法中正常运行, 或在Java助记符中:第16行。
但是在某些环境中,我看到此返回错误。 怎么可能?

  

编辑:以我的情况而言,这里是精确的:Hibernate从中获取BIT   数据库并设置为布尔字段。这个布尔字段有一个吸气剂,   这就是我上面的程序中的getBoolean()

1 个答案:

答案 0 :(得分:0)

除非我在这里没有找到明显的地方,否则这完全有可能,并且取决于getBoolean返回的内容:

public static Boolean getBoolean() {
    return new Boolean(true);
}

Boolean aha = Boolean.TRUE;
Boolean aha2 = getBoolean();

System.out.println(aha == aha2); // false

显然,在比较Boolean::equals时必须使用Boolean