在Java中显式比较布尔常量(例如if(b==false))是否不好?

在Java中显式比较布尔常量(例如if(b==false))是否不好?,java,coding-style,boolean,Java,Coding Style,Boolean,写这样的东西不好吗 if (b == false) //... while (b != true) //... 是否总是最好改为写: if (!b) //... while (!b) //... 大概在性能上没有差别(或者是否有差别?),但你如何衡量两者之间的明确性、简洁性、清晰性、可读性等 更新 为了限制主观性,我还希望引用权威编码风格指南中的任何内容,哪一个总是更可取的,或者什么时候使用 注意:变量名b只是作为一个例子,alafoo和bar除了在初学者编写的代码中,我从未见过前者;

写这样的东西不好吗

if (b == false) //...

while (b != true) //...
是否总是最好改为写:

if (!b) //...

while (!b) //...
大概在性能上没有差别(或者是否有差别?),但你如何衡量两者之间的明确性、简洁性、清晰性、可读性等

更新 为了限制主观性,我还希望引用权威编码风格指南中的任何内容,哪一个总是更可取的,或者什么时候使用



注意:变量名
b
只是作为一个例子,ala
foo
bar

除了在初学者编写的代码中,我从未见过前者;总是后者,我不认为有人真的被它弄糊涂了。另一方面,我认为

int x;
...
if(x) //...
vs


更值得商榷的是,在这种情况下,我更喜欢第二个,我认为这很烦人。但我不会为此引起骚动。

这不一定是坏事,只是多余的。而且,实际变量名的权重很大。例如,我更喜欢
if(userIsAllowedToLogin)
上面的
if(b)
或者更糟糕的
if(flag)

至于性能问题,编译器会以任何方式对其进行优化


更新:至于权威来源,我在中找不到明确的信息,但至少有一个模块会对此发出警告。

我更喜欢第一个,因为它更清晰。这台机器也可以读得同样好,但我试着编写代码让其他人阅读,而不仅仅是机器。

你不应该使用第一种样式。我看到人们使用:

  • if(b==true)
  • if(b==false)
我个人觉得读起来很难,但还可以。然而,这种风格的一个大问题是,它导致了你展示的难以置信的反直觉的例子:

  • 如果(b!=true)
  • 如果(b!=false)

这需要读者付出更多的努力来确定作者的意图。就我个人而言,我发现包含对真或假的明确比较是多余的,因此更难阅读,但这就是我。

不应该使用第一种样式的主要原因是因为这两种样式都是有效的:

if (b = false) //...

while (b = true) //...

也就是说,如果您不小心漏掉了一个字符,您将创建一个赋值而不是比较。赋值表达式求值为已赋值的值,因此上面的第一条语句将值
false
赋值为
b
,并求值为
false
。第二个将
true
赋值给
b
,因此它的计算结果总是
true
,无论您在循环中使用
b
做什么。

IMHO,我认为如果您只在bool变量名前面加上
“Is”
,它将是不言而喻的,并且更有意义,您可以删除与
true
false

示例:

isEdited  // use IsEdited in case of property names
isAuthorized // use IsAuthorized in case of property names

etc

这是一个强烈的品味问题

就我个人而言,我发现
if(!a){
if(a==false){
可读性差很多(编辑:对我来说),因此在以后维护代码时更容易出错,我已转换为使用后一种形式

基本上,我不喜欢为逻辑运算选择符号而不是单词(C与Pascal),因为对我来说,a=10而不是b=20比a=10&&!(b=20)更容易阅读,但Java就是这样


任何使用“==false”方法来支持“!”的人显然从来没有长时间盯着代码看,也没有错过那个感叹号。是的,你可以盲代码。

就我个人而言,我会重构代码,所以我不会使用否定测试。例如

if (b == false) {
   // false
} else {
   // true
}

依我看,在90%的情况下,代码可以重构,因此不需要负面测试。

我认为这很糟糕

while (!b) {
    // do something 
}
读起来比读起来好多了

while (b != true) {
    // do something 
}

通常的指导原则是永远不要对布尔值进行测试。一些人认为额外的冗长会增加清晰度。添加的代码可能会帮助一些人,但每个读者都需要阅读更多的代码

今天早上,我花了半个小时才找到一个bug。代码是

    if ( !strcmp(runway_in_use,"CLOSED") == IPAS_FALSE)
      printf(" ACTIVE    FALSE \n");   else
      printf(" ACTIVE    TRUE \n");
如果它是用常规编码的,我会更快地发现它是错的:

    if (strcmp(runway_in_use, "CLOSED"))
      printf(" ACTIVE    FALSE \n");   else
      printf(" ACTIVE    TRUE \n");

我更喜欢长的方法,但我比较使用
=
而不是
!=
99%的时间

我知道这个问题是关于Java的,但我经常在语言之间切换,例如,在
C#
中,在处理可为空的bool类型时,比较(
==false
)会有所帮助。因此我养成了这样的习惯,即比较
true
false
,但使用
=
操作符

我这样做:

if(isSomething==false)
if(isSomething==true)

但我讨厌这些:

if(isSomething!=false)
if(isSomething!=true)

因为显而易见的可读性原因


只要代码保持可读性,这就无关紧要了。

第一个选项(b==false)不受欢迎的原因之一是初学者通常没有意识到第二个选项(!b)这是完全可能的。因此,使用第一种形式可能会指向对布尔表达式和布尔变量的误解。这样,使用第二种形式就变成了一种sjiboleth:当有人写这篇文章时,他/她可能知道发生了什么


我相信这导致了人们认为这种差异比实际情况更重要。

这是我关于StackOverflow的第一个答案,所以请小心。。。 最近在重构时,我注意到有两块代码几乎完全相同,但有一块使用了相同的代码

for (Alert alert : alerts) {
    Long currentId = alert.getUserId();

    if (vipList.contains(currentId)) {
        customersToNotify.add(alert);

        if (customersToNotify.size() == maxAlerts) {
            break;
        }
    }
}
另一个有

for (Alert alert : alerts) {
    Long currentId = alert.getUserId();

    if (!vipList.contains(currentId)) {
        customersToNotify.add(alert);

        if (customersToNotify.size() == maxAlerts) {
            break;
        }
    }
}
因此,在这种情况下,使用
boo创建一个适用于这两种情况的方法是有意义的
for (Alert alert : alerts) {
    Long currentId = alert.getUserId();

    if (vipList.contains(currentId)) {
        customersToNotify.add(alert);

        if (customersToNotify.size() == maxAlerts) {
            break;
        }
    }
}
for (Alert alert : alerts) {
    Long currentId = alert.getUserId();

    if (!vipList.contains(currentId)) {
        customersToNotify.add(alert);

        if (customersToNotify.size() == maxAlerts) {
            break;
        }
    }
}
private void appendCustomersToNotify(List<Alert> alerts
        List<Alert> customersToNotify, List<Long> vipList, boolean vip){

    for (Alert alert : alerts) {
        Long currentId = alertItem.getUserId();

        if (vip == vipList.contains(currentId)) {
            customersToNotify.add(alertItem);

            if (customersToNotify.size() == maxAlerts) {
                break;
            }
        }
    }
}