最佳实践:if(foo== false) 或 if(!foo)

10

可能是重复问题:
什么是在Java中编写布尔表达式的首选方式

今天我和同事发生了争论。在Java代码中,使用布尔变量加上if语句的方式哪种更好。

boolean foo=true
//1. 

if(foo == false)
    // do something
else
    // do something else

//2.

if(!foo)
    // do something
else
    // do something else

我支持 [1],因为我认为它更易读。


好的,现在我必须向我的朋友(和你们)认输。感谢大家的快速参与。 :) - pavanlimo
2
如果你支持1,为什么要止步于此?归谬法要求你使用 if ((((foo == false) == true) == true) == true) ... - paxdiablo
好吧!我放弃了!我的手举起来了! - pavanlimo
请参见https://dev59.com/-nE85IYBdhLWcg3wr1ge。 - polygenelubricants
刚刚谷歌了一下,我认为这要视情况而定。如果变量很长,例如在Java中可能是这种情况,那么选项1更易读:thisIsALongClassName.IsAllowedToDoSomething == false比!thisIsALongClassName.IsAllowedToDoSomething更易读。但是,如果“!”和要测试的变量之间的距离很短,则选项1更好。 - Yvon Huynh
7个回答

13

第二点,与“foo”拥有描述性名称相似,使代码阅读起来更加清晰:

if (!hasPurple) ...


是的,更好命名的变量绝对是正确的方法。这样代码会更易读。 - drekka

6
我认为第二种写法更易读。我认为每个Java开发者(我是C#开发者)都知道!的含义。
虽然这可能不是重点,但我更喜欢将“true”块放在语句中。如果条件通常为false,则我会为变量命名以表示。
if (notFoo) 
  // do something when
else
  // do something else

1
我不同意。布尔变量应尽可能断言地命名。您应该始终将!读作“not”,如果您确实需要foo,则避免令人困惑的双重否定!notFoo。唯一的例外是当foo有一个反义词(例如凸面 vs 凹面)。 - ILMTitan
同意双重否定是不好的 :) 但是,如果仅使用if-else,!notFoo将只被命名为Foo :) - Rob Gray

5

我认为避免以下事项是一个好主意:

if (foo == true){}

因为有时候你可能会写

if (foo = true){}

作为一种排版错误,通常很容易发现。但是它似乎很容易导致犯这个小错误。

if (foo = true) {} 不是合法的Java语句,不能编译(在您的IDE中也应当标注为错误语法)。害怕 if (var = constant) 语句来自C语言,并不适用于Java,在C语言中这种语法是合法的(有时甚至是鼓励使用),但在Java中则不然。请停止担心这个问题,相反,关注代码的可读性。 - Avi
1
@Avi:确实可以在JDK6下编译。我给你留下了疑问的余地,并自己编写了它。它在FreeBSD系统上通过命令行和Eclipse编译,没有任何警告,并且Eclipse也没有显示任何警告。 - JBirch
你是正确的。我道歉。我感到困惑,因为大多数赋值表达式在条件语句中都是非法的,除非它们是布尔类型(因为Java中没有自动的int-to-boolean或pointer-to-boolean转换)。尽管如此,我仍然会选择更易读的方式。对于整数,我会写if (foo == CONSTANT);对于布尔值,我只会写if (foo),这既更易读,也避免了这个问题。 - Avi

1
当在语句中使用布尔变量作为条件时,不要将其与 true 进行比较。 这不是错误,但风格不好。既然它已经是一个布尔值,那么就直接使用它即可。
"!foo"比"foo == false"更好的原因。参考from
  • 简洁性:假设您在需要布尔值的上下文中,且"x"是一个布尔值,则写"x"比写"x == true"或"!x"比写"x == false"更少字符。

  • 约定:Java(或C、C++、C#和大多数其他语言)中经验丰富的程序员希望看到"x"而不是"x == true",以及"!x"而不是"x == false"。

  • 鲁棒性:在Java中,所有条件和循环语句都需要布尔值表达式作为条件。如果"y"不是布尔值,则形式为"if(y=foo){"的拼写错误将在Java中导致编译错误。但是,如果"y"是布尔值,则"if(y=foo){"不会导致编译错误。因此,通过避免对布尔值使用"==",可以避免由于拼写错误导致的一系列错误。

"

3
-1 分是因为你完全复制粘贴了 Stephen 的回答。即使有链接,你的内容看起来像是你自己的,或者换句话说,你对它进行了改写,但实际上并没有。请将其格式化为引用,以消除歧义。其次,如果这个复制粘贴的答案是合适的,那么问题很可能是一个重复的问题,应该关闭。总之,这只是一个不好的做法。 - Pascal Thivent
@Pascal Thivent 对于我的回答,我加入了我的观点(粗体的前两行),并添加了Stephen的引用部分。我还添加了引用的链接。我不打算表明引用部分是我的观点。如果有这样的感觉,我很抱歉。我已经消除了歧义,并清楚地标注了引用。 - YoK
谢谢您消除了歧义。我真的认为最大化透明度非常重要,我会撤销我的反对票。 - Pascal Thivent

0

我选择2,因为作为程序员,即使是2也很容易阅读。

想象一下,如果你有数百个这样的验证检查,你总是会检查假吗。

不会


0

如果你是唯一一个维护你的代码的人,那么你可以自由地使用任何你喜欢的风格。

话虽如此,我认识的大多数开发人员都更喜欢使用 !foo 风格。


0

这是个主观看法的问题。我更喜欢第二种方式,因为需要编写的代码较少,而且我认为它与第一种方式一样易读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接