Intellij idea 为什么IntelliJ IDEA在比较中优先选择常量?

Intellij idea 为什么IntelliJ IDEA在比较中优先选择常量?,intellij-idea,Intellij Idea,IDEA建议将类似于(object.method()==CONSTANT)的比较翻转为(CONSTANT==object.method()),但它没有给出原因。第二条路真的更好吗?如果是,为什么 我知道,对于短路运算符&&&和|,顺序很重要,但是对于其他二进制运算符,无论如何都必须对函数进行求值。我错过了什么 我使用IntelliJ IDEA 2016 1.3。IntelliJ IDEA不会先“偏好”常量。有两个检查,“比较左侧的常量”和“比较右侧的常量”,这两个检查默认为禁用。如果您看到像ob

IDEA建议将类似于
(object.method()==CONSTANT)
的比较翻转为
(CONSTANT==object.method())
,但它没有给出原因。第二条路真的更好吗?如果是,为什么

我知道,对于短路运算符
&&&
|
,顺序很重要,但是对于其他二进制运算符,无论如何都必须对函数进行求值。我错过了什么

我使用IntelliJ IDEA 2016 1.3。

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


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

这可能只是一个checkstyle首选项。我在不同的团队/项目中都看到了这两种变体。实际上,这只是个人偏好的问题


找出配置为使用的checkstyle实现IntelliJ。这不符合您的喜好,您可以随时下载另一个,然后使用它。

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

至于为什么默认情况下是这样,我可以提出两个原因,与
=
操作数的顺序无关,而是因为顺序对于
等于
assertEquals
比较有意义,编码标准可能希望==比较的顺序相同

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

if(CONSTANT.equals(foo)){...}
安全性比

if(foo.equals(CONSTANT)){...}
因为如果foo为null,第一个将不会获得NPE

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

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

if(CONSTANT.equals(foo))
另一个原因可能是,在某些API中,“预期”值通常在被测试的值之前,如junit的
assertEquals
,如果预期值不在第一位,则会产生错误的诊断信息


我过去听说的一个原因是,当比较中的预期值排在第一位时,它的可读性更好——如果它排在第一位,则不必在表达式中查找要检查的值。

如果您接受该建议,它将建议再次翻转它。这取决于你决定什么是你觉得最可读的。你也可以看看,它描述了优点(下面的答案中也有一些)和criticism@JBNizet对于
while(tree.children().length==1)
,它会将其翻转一次,然后建议将其翻转回去,但接受翻转不会起任何作用。@Morfic Yoda条件页面非常适合,谢谢!很高兴能帮上忙,愿消息来源与你同在。。。