【问题标题】:Boolean.TRUE == someMethod(), where return type is Boolean for someMethod() and it returns a literal trueBoolean.TRUE == someMethod(),其中 someMethod() 的返回类型是布尔值,它返回一个字面量 true
【发布时间】:2019-01-29 17:35:18
【问题描述】:

请看下面的程序:-

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 Mnemonics 中: 线号最后一个方法的0和1,即getBoolean() method, 我们看到自动装箱发生,即iconst_1int 1(此处表示“真”)(在第 0 行)被传递给 Boolean.valueOf() 方法(在第 1 行)。
Java.Lang中的Boolean.valueOf(boolean b)方法,则返回一个常量Boolean.TRUEBoolean.FALSE

因此,== 检查应该始终正常工作,在程序 main 方法中, 或在 Java Mnemonics 中:第 16 行。
但在某些环境中,我看到这返回错误。 怎么可能?

编辑:在这里,在我的例子中,准确地说:Hibernate 从 数据库并设置为布尔字段。这个布尔字段有一个吸气剂, 这是我上面程序中的getBoolean()

【问题讨论】:

  • 你的代码运行在什么样的环境中?是否涉及多个类加载器?
  • 根据 javadoc Boolean.valueOf() 返回 Boolean.TRUEBoolean.FALSE。因此,这导致false 不会发生,除非您的 jvm 实现中存在错误或真正损坏的类加载器层次结构。 (给你falseBoolean更有可能是刚刚用new Boolean(boolean)创建的)
  • @k5_ 我更担心布尔值不会以某种方式被保留,因此对象比较会接管。
  • 添加,布尔值,即从方法中获取的,正在从 MySQL 表中的 BIT 列中获取。特定 SQL 类型 BIT 的 Java 类型是 java.lang.Boolean。 Hibernate 正在获取此数据。
  • 那么它可能是一个Hibernate错误(即Hibernate不使用@k5_所说的常量),但最好不要使用==来比较对象首先。

标签: java hibernate boolean core boolean-expression


【解决方案1】:

除非我在这里遗漏了明显的东西,否则这是完全可能的,并且取决于 getBoolean 返回的内容:

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

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

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

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

【讨论】:

  • 是的,更正一个新的布尔值(布尔值)会使它变为假。这是我可以假设的唯一情况,这可能会发生。但是,休眠是否从数据库中获取 BIT,并返回一个新的 Boolean(bitValue)?
  • @AayushShrivastava 你为什么不找出答案,发布答案,如果有(并且在更高版本中尚未修复)向 Hibernate 开发人员报告错误。
  • 当然,如果是Boolean.TRUE == getBoolean(),则不需要使用equals,可以直接使用true == getBoolean(),或者更好的是getBoolean()
猜你喜欢
  • 2017-07-08
  • 2018-02-27
  • 2012-11-16
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 2012-09-26
  • 2014-05-16
  • 1970-01-01
相关资源
最近更新 更多