Java fb contrib的错误回复:搜索引擎优化次优表达式顺序?

Java fb contrib的错误回复:搜索引擎优化次优表达式顺序?,java,findbugs,sonarqube5.6,Java,Findbugs,Sonarqube5.6,SonarQube认为以下代码违反了规则fb contrib:SEO\u SUBOPTIMAL\u EXPRESSION\u ORDER(注意,代码示例是简化的,不符合逻辑): 性能-方法以次优方式按条件对表达式排序 (fb contrib:SEO_次优_表达式_顺序) 例如,此方法在if或while语句中构建条件表达式,其中表达式既包含简单的局部变量比较,也包含对方法调用的比较。表达式对这些进行排序,以便方法调用在简单的局部变量比较之前进行。这会导致方法调用在不需要的条件下执行,从而可能导致大

SonarQube认为以下代码违反了规则fb contrib:SEO\u SUBOPTIMAL\u EXPRESSION\u ORDER(注意,代码示例是简化的,不符合逻辑):

性能-方法以次优方式按条件对表达式排序 (fb contrib:SEO_次优_表达式_顺序)

例如,此方法在if或while语句中构建条件表达式,其中表达式既包含简单的局部变量比较,也包含对方法调用的比较。表达式对这些进行排序,以便方法调用在简单的局部变量比较之前进行。这会导致方法调用在不需要的条件下执行,从而可能导致大量代码无偿执行。通过对表达式进行排序,使包含局部变量条件的简单条件优先,可以消除这种浪费。这假设方法调用没有副作用。如果该方法确实有副作用,那么最好将这些调用从条件中拉出来,并首先执行它们,为局部变量赋值。通过这种方式,您可以提示该呼叫可能有副作用

我认为规则实现查看实际表达式内部是合理的,如果内容是值检查,则不会触发冲突


这是一个bug还是我遗漏了什么?您几乎已经在问题中给出了答案:

这会导致方法调用在不需要的条件下执行,从而可能导致大量代码无偿执行。通过对表达式进行排序,使包含局部变量条件的简单条件优先,可以消除这种浪费

FB Contrib希望您改变表达方式:

boolean foo() { 
    return baz==Baz.VALUE && bar();
}
这样,只有当
baz==baz.value
时,才需要执行
bar()。当然,这是编译器或JVM可能会优化的东西,因此可以归结为一个微型基准测试来确定这一预防措施是否真的是必要的

但这在语法层面上是有意义的,因为调用方法通常比值检查更昂贵。因此,您不需要查看方法内部就可以知道这一点。对编译器/JVM内联行为的任何猜测都可能是错误的。

foo()
的性能不太理想,不是因为SonarQube给出的原因,而是因为它可以写为
返回false;-);-)我尽量简化我的例子,但你当然是对的。无视愚蠢的代码(无论如何,这是完全不同的违规行为)
boolean foo() { 
    return baz==Baz.VALUE && bar();
}