为什么IntelliJ IDEA在比较中首先选择常量?

时间:2016-06-28 13:10:56

标签: intellij-idea

IDEA建议将(object.method() == CONSTANT)(CONSTANT == object.method())进行比较,但它没有给出理由。第二种方式真的更好吗?如果是,为什么?

我知道顺序对于短路运算符&&||很重要,但对于其他二元运算符,无论如何都必须对该函数进行求值。我在这里缺少什么?

我使用IntelliJ IDEA 2016 1.3。

3 个答案:

答案 0 :(得分:7)

IntelliJ IDEA首先不“优先”常量。有两个检查,“比较左侧的常量”和“比较右侧的常量”,两者都默认禁用。如果您看到object.method() == CONSTANT这样的代码突出显示为警告,那么它就会以您的项目代码样式启用,您应该询问为您的推理配置项目样式的人员。一些代码样式更喜欢在左侧放置常量,以确保如果有人意外使用=而不是==,代码将无法编译,因为您无法分配常量。

还有意图动作来翻转任何比较操作。意图操作是可用于自动执行某些代码编辑操作的工具。它们的可用性并未表明IntelliJ IDEA方面的任何偏好;它们只是编辑代码的工具。

答案 1 :(得分:2)

许多分析检查都是为具有编码标准的开发团队提供的,这些编码标准由于某种原因而偏好某个操作顺序。可以根据组织的策略打开或关闭它们,甚至可以将策略分发给开发人员以鼓励统一。因此,一些分析是矛盾的,因为一些组织更倾向于一种方式而另一种方式则倾向于另一种方式。在这种情况下,由组织来解释为什么一个人比另一个人好。

至于为什么默认采用这种方式,我可以提出两个原因,不必考虑==操作数的排序,而是因为顺序对equals和{{assertEquals有意义。 1}}比较和编码标准可能希望==比较的顺序相同。

首先,将常数放在首位通常更安全。例如,表达式

if(CONSTANT.equals(foo)){...}

更安全
if(foo.equals(CONSTANT)){...}

因为如果foo为null,第一个将不会获得NPE。

其次,它可以简化代码。例如,以下内容是等效的:

if(foo != null && foo.equals(CONSTANT)){...}

if(CONSTANT.equals(foo))

另一个原因可能是在某些apis中,“预期”值通常出现在被测试的值之前,如junit的assertEquals,如果预期值不是第一个,则会产生不正确的诊断信息。

我过去听到的一个原因是,当比较中的预期值首先出现时,它会更好地读取 - 如果它首先出现,则不必寻找表达式中检查的值。

答案 2 :(得分:1)

这可能只是一种检查式偏好。我已经看到不同团队/项目中的两种变化都是首选。在实践中,这只是个人偏好的问题。

找出IntelliJ配置为使用哪种checkstyle实现。这不是你喜欢的,你总是可以下载另一个并改为使用它。