SonarQube的分析器在我们的Java代码中报告了大量这些消息。
方法
foo(String, String)
不必要地输入布尔常量
在许多情况下,它会返回true
Boolean
返回类型方法。
我很想知道2017年Oracle Java 8在多大程度上是一个(性能?)问题?它真的最终会创建新的Boolean
实例,还是会自动地优化为Boolean.TRUE
?
更新
声纳规则键为fb-contrib:NAB_NEEDLESS_BOOLEAN_CONSTANT_CONVERSION
。
答案 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
获得一个静态常量并返回它应该更有效率。