【问题标题】:"Method foo() needlessly boxes a boolean constant" Sonar warning“方法 foo() 不必要地装箱了一个布尔常量”声纳警告
【发布时间】:2017-08-25 13:58:58
【问题描述】:

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

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

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

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

更新

Sonar 规则键是fb-contrib:NAB_NEEDLESS_BOOLEAN_CONSTANT_CONVERSION

【问题讨论】:

  • 您能指定引发问题的规则的规则键吗?
  • @Michael-SonarSourceTeam:已更新。

标签: java sonarqube


【解决方案1】:

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

  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

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

【讨论】:

  • “应该更有效”JIT 会很好地使它们完全相同。
  • 我完全同意。这就是我在这里使用条件的原因,这是检查的原因,它很可能是由 VM 优化的。
  • 效率不会更高。 JVM 内联了这个微小的静态方法,并且可以轻松地将编译后的程序集转换为相同的。
猜你喜欢
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多