在Java中编写布尔表达式的首选方式是什么?

7

我一直这样编写我的布尔表达式:

if (!isValid) {
  // code
}

但我的新雇主坚持以下风格:
if (false == isValid) {
  // code
}

有一个样式是首选还是标准的吗?

5
哇,又一个向未来雇主提出的问题。(明确地将其与布尔常量进行比较是愚蠢的。) - Pointy
5
如果你是一个代码混淆器,我会说第二个选项更好,但只有在这种情况下。 - Jens Schauder
3
虽然我更喜欢第一种方式,但你可能需要坚持使用雇主的标准。 - basszero
1
感谢您的反馈。我们将看看我是否能够在团队中改变标准。 - Timothy
2
请参见https://dev59.com/-nE85IYBdhLWcg3wr1ge。 - polygenelubricants
显示剩余4条评论
9个回答

10

我喜欢第一种风格,因为它更自然易读。第二种风格很不寻常。

有些人可能更喜欢第二种风格的原因是:

if (isValid == false) { ... }

如果你使用后者时不小心写了一个单独的=而不是==,那么你正在将值赋给isValid而不是进行测试,但是如果首先使用常量,您会收到编译错误。

但是使用您的第一个建议,这个问题甚至都不是问题,所以这是更喜欢第一个建议的另一个原因。


实际上,如果isValid是一个变量(除非它是final),那么这个错误并不会有编译错误。这真的很糟糕。显然,如果isValid是一个方法或表达式,问题就会少一些,但作为习惯... - Carl
2
我相信这就是顺序颠倒的原因。“if(false=isValid)”是一个错误。 - DJClayworth

8

大家都认识这个代码片段:

if (isValid.toString().lenght() > 4) {
   //code
}

我认为你的第二个例子指向同一个方向。

8

绝对是第一个选项。第二个选项表明对表达式和值的本质缺乏理解,并且作为编码标准的一部分,它暗示着雇主期望雇佣非常无能的程序员 - 这不是一个好兆头。


你把我逼疯了,但至少这意味着我不是疯了。 - Timothy

4

几个小时前,关于C#进行了讨论

false == isValid结构是从C语言世界遗留下来的,那里编译器允许您在if语句中进行赋值。我相信Java编译器会在这种情况下发出警告。

总体而言,第二个选项过于冗长。


在Eclipse中,表达式中的布尔赋值不会给我带来任何编译器错误或警告。 - Carl
一般的布尔赋值不会,但是尝试给内置常量“false”赋值会 - 因此需要注意顺序。在旧的C代码(我指的是旧版本),FALSE通常是一个被分配的变量,可以被覆盖。 - DJClayworth

2

我认为第一个更易读,而第二个则更冗长。

我肯定会选择第一个。


2

你正在评估变量,而不是false,因此从可读性的角度来看,后者是不正确的。因此我个人会坚持第一个选项。


2

我将尝试在这里进行全面的回答,包含了以上所有回答。

首选第一种风格,因为以下原因:

  • 它更短
  • 它更易读,因此更容易理解
  • 它更广泛使用,这意味着读者将更快地识别模式
  • "false==..."而不是"...==false"又是自然顺序的另一种违反,这使得读者想“是否有什么奇怪的事情需要我注意”,当事实并非如此时。

唯一的例外情况是变量是布尔类型而不是 boolean 类型。在这种情况下,第二种表达式与第一种表达式不同,当 isValid 为 null 以及 Boolean.FALSE 时都会评估为 false。如果是这种情况,则有充分的理由使用第二个表达式。


1
第二种风格不需要你自己否定表达式(这可能比仅仅写“isValid”要复杂得多)。但是,如果您忘记输入两个等号,则写“isValid == false”可能会导致意外赋值,因此惯用法是将不能成为rvalue的内容放在右侧。
第一种风格似乎更受那些知道自己在做什么的人青睐。

我喜欢“否定”所采用的不同视角。在某些情况下,用于否定的!非运算符可能会降低可读性,甚至被忽略。密集排版、符号!i的视觉上下颠倒可能会使if (!isValid)if (notValid)(参见Python的not)更难阅读。我们还可以将否定移入语义中以表达意图:if (hasViolations)。这种设计支持异常处理,将正常路径作为默认路径(例如,仅在无效时分支和除外),否则继续执行。 - hc_dev

1

我只想说,我二十年前在学校学习了C语言,然后转向Perl、Java和现在的C#,它们都有相同的语法...

我认为(!myvar)是最流行的

我认为(myvar==false)也很好

在20年里,我甚至从未见过

(false==myvar) 

我觉得你的老板在吸毒——很抱歉,但我认为这是你的老板控制狂或笨蛋的表现。


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