🤔问题

SonarQube的分析器在Java代码中报告了许多此类消息.

Method xxx() needlessly boxes a boolean constant

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

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

更新

声纳规则关键是FB-的contrib:NAB_NEEDLESS_BOOLEAN_CONSTANT_CONVERSION.

🙋最佳答案

此问题背后的原因是,您无缘无故调用了一种方法.我们如何验证这一点:
让我们来看看这个(复杂的;)代码

  1. Boolean foo(String s) {
  2. return true;
  3. }

可以做的就是对此进行反编译.这为我们提供了以下字节码指令(为简便起见,简化了一点)

  1. ICONST_1
  2. INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
  3. ARETURN

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

如果现在将代码更改为:

  1. Boolean foo(String s) {
  2. return Boolean.TRUE;
  3. }

生成的字节码为:

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

这将获取一个静态常量并返回它应该更有效.