IDEA建议将(object.method() == CONSTANT)
与(CONSTANT == object.method())
进行比较,但它没有给出理由。第二种方式真的更好吗?如果是,为什么?
我知道顺序对于短路运算符&&
和||
很重要,但对于其他二元运算符,无论如何都必须对该函数进行求值。我在这里缺少什么?
我使用IntelliJ IDEA 2016 1.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实现。这不是你喜欢的,你总是可以下载另一个并改为使用它。