依靠Java的短路评估(编码风格)

时间:2014-05-16 15:34:29

标签: java coding-style

在布尔评估中严重依赖短路是否是一种好的编码风格?

我认识一个喜欢这样做的人。 例如,如果业务逻辑是"如果Alice不饿,或者Alice和Bob都饿了"而不是写

// if Alice is not hungry or both alice and bob are hungry
if (!A || A && B)` 

他会写

// if Alice is not hungry OR both alice and bob are hungry
if (!A || B)

认为||是短路的,所以当且仅当第一个是false(意味着A = true)时才会评估右操作数。

(令人烦恼的是,乍一看,你会认为这是一个错误,但如果你把它改成更明显的话,你会觉得你看起来很愚蠢!)

5 个答案:

答案 0 :(得分:10)

你当然可以而且应该依赖于表达式中的短路,但你给出的例子就是糟糕的编程。表达式的逻辑应该与注释和测试的人类可读逻辑相匹配。优化器完全理解布尔逻辑,并将优化你的队友可能抱怨的任何明显的低效率。

最重要的是为开发人员提供清晰易懂的代码。编写聪明的代码来证明你是多么聪明,这绝不是一个好习惯。

答案 1 :(得分:8)

这是一种好的风格吗?是的,我认为大多数人都会欣赏这种惯用的风格:

myFoo != null && myFoo.myMethod();

答案 2 :(得分:3)

这与短路没有任何关系;即使没有短路,这两个表达式也是等效的:

A    B       !A | A & B     !A | B
-----------------------------------
0    0       1               1
0    1       1               1
1    0       0               0
1    1       1               1

选择您认为将来更容易理解和管理的任何一个;任何更明确地表达你的目的。在这方面明显的赢家似乎是你的第一个片段。

答案 3 :(得分:0)

我认为在这种情况下,无论是否短路,结果都是一样的。他不依赖于此处的短路,而是简化所需的逻辑。

在我看来,没有一个非常坚实的黑白答案。我个人不会简化这样的逻辑陈述,因为对我来说,当我稍后再回到它时很难读。添加额外的逻辑来明确解释我的检查不会

答案 4 :(得分:0)

在这种情况下,您实际上并非“依赖”短路评估。您只是简化了布尔表达式。该逻辑与&&&的作用相同。

短路的影响是:

  • 避免执行短路代码(可能有副作用,抛出异常或无法终止)
  • 潜在地保存一些多余的计算

因此,短路不会以任何方式改变布尔结果。