“方法foo()不必要装箱一个布尔常量”声纳警告

wil*_*ilx 3 java sonarqube

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

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

在许多情况下,它返回的trueBoolean返回类型方法。

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

更新

声纳规则键为fb-contrib:NAB_NEEDLESS_BOOLEAN_CONSTANT_CONVERSION

ben*_*ico 5

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

  Boolean foo(String s) {
   return true;
  }
Run Code Online (Sandbox Code Playgroud)

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

ICONST_1
INVOKESTATIC java/lang/Boolean.valueOf (Z)Ljava/lang/Boolean;
ARETURN
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个方法调用Boolean从常量1 创建一个。

如果现在将代码更改为:

  Boolean foo(String s) {
   return Boolean.TRUE;
  }
Run Code Online (Sandbox Code Playgroud)

生成的字节码为:

GETSTATIC java/lang/Boolean.TRUE : Ljava/lang/Boolean;
ARETURN
Run Code Online (Sandbox Code Playgroud)

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

  • JIT将“使它们更有效”将做得很好。 (2认同)