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

时间:2017-08-25 13:58:59

标签: java sonarqube

SonarQube的分析器在我们的Java代码中报告了大量这些消息。

  

方法foo(String, String)不必要地输入布尔常量

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

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

更新

声纳规则键为fb-contrib:NAB_NEEDLESS_BOOLEAN_CONSTANT_CONVERSION

1 个答案:

答案 0 :(得分:4)

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

  Boolean foo(String s) {
   return true;
  }

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

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

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

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

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

生成的字节码是:

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

获得一个静态常量并返回它应该更有效率。