Java &引用;方法foo()不必要地将布尔常量“装箱”;声纳警报

Java &引用;方法foo()不必要地将布尔常量“装箱”;声纳警报,java,sonarqube,Java,Sonarqube,SonarQube的分析器在Java代码中报告了一堆这样的消息 方法foo(String,String)不必要地将布尔常量装箱 在许多情况下,对于Boolean返回类型方法,它返回true 我想知道2017年Oracle Java 8在多大程度上存在(性能?)问题?它真的最终会创建新的Boolean实例,还是会自动优化为Boolean.TRUE实例 更新 Sonar规则键是fb contrib:NAB\u不必要的\u布尔值\u常量\u转换这个问题背后的原因是,您调用方法没有充分的理由。我们如何验

SonarQube的分析器在Java代码中报告了一堆这样的消息

方法
foo(String,String)
不必要地将布尔常量装箱

在许多情况下,对于
Boolean
返回类型方法,它返回
true

我想知道2017年Oracle Java 8在多大程度上存在(性能?)问题?它真的最终会创建新的
Boolean
实例,还是会自动优化为
Boolean.TRUE
实例

更新


Sonar规则键是
fb contrib:NAB\u不必要的\u布尔值\u常量\u转换

这个问题背后的原因是,您调用方法没有充分的理由。我们如何验证这一点: 让我们看看这个(复杂的;))代码

可以做的是反编译这个。这为我们提供了以下字节码指令(为简洁起见,简化了一点)

如您所见,有一个方法调用从常量1创建
布尔值

如果我们现在将代码更改为:

  Boolean foo(String s) {
   return Boolean.TRUE;
  }
生成的字节码是:

GETSTATIC java/lang/Boolean.TRUE : Ljava/lang/Boolean;
ARETURN

这就是获取一个静态常数并返回它,这应该更有效

你能指定引发问题的规则的规则键吗?@Michael SonarSourceTeam:Updated。“哪一个应该更有效”JIT可以很好地使它们完全相同。我完全同意。这就是我在这里使用条件的原因,这是检查的理由,它很可能是由VM优化的。它不会更有效。JVM将这个微小的静态方法内联在一起,并且可以轻松地将编译后的程序集转换为相同的程序集。
  Boolean foo(String s) {
   return Boolean.TRUE;
  }
GETSTATIC java/lang/Boolean.TRUE : Ljava/lang/Boolean;
ARETURN