在Java中,应该避免使用多个if语句,如“if(条件)if(条件)…”吗?

5

我的IDE(IntelliJ IDEA)告诉我,我可以选择在这个if语句中删除括号:

if (objectIsOfTypeFoo) {
    if (objectOfTypeFooIsShared) {
        // do something with Object of type Foo knowing that it's shared...
    } else {
        // do something with Object of type Foo knowing that it's not shared...
    }
} else if (objectIsOfTypeBar) {
    ...
}

变成:

if (objectIsOfTypeFoo) if (objectOfTypeFooIsShared) {
    // do something with Object of type Foo knowing that it's shared...
} else {
    // do something with Object of type Foo knowing that it's not shared...
} else if (objectIsOfTypeBar) {
    ...
}

我理解这样做很有道理,去掉缩进是很诱人的,但我的担心是可读性可能会受到影响。后者看起来更整洁,但节省的空间是否值得潜在的混淆呢?

我认为两种方式之间的性能差异微不足道,甚至可以忽略不计。

作为一个跟进的问题:单行中有多少个“if (condition)”是有限制的吗?或者说,在什么时候变得太多了?


4
第一个例子更易读,由于漏掉括号而导致问题的可能性较小 - 在我看来。 - MadProgrammer
2
运行时的性能差异为零,因为两个版本的代码生成相同。编译时的性能差异是词法分析额外括号的成本。所以是零。哦,而且无视IDE:它(在我的意见中)提供了可怕的建议。 - dlev
我从未见过IntelliJ推荐这样的事情。我会检查你的样式设置。 - duffymo
4个回答

8
我支持你已经拥有的方式。
我甚至不使用这个:
if(foo)
   return bar;

我更喜欢这个:

if(foo){
   return bar;
}

"程序必须写得易于人阅读,只是偶然才为机器执行而写"

2
+1 - 是的,确实如此,但是要考虑风格和完美的引用。就我个人而言,我建议您接受这个建议。 - duffymo
1
我不同意,我认为当if语句像if(foo)throw exception这样简单时,并不是不好的。 - nachokk

4

始终使用括号。某一天,您可能想要在 if 或 else 块中添加第二个语句,然后您会希望自己曾经使用过括号。但是,你真的在进行 instanceof 检查吗?您能否重新设计程序,将其转换为多态对象行为?


1
通常当有人写出这样复杂的代码时,进一步的思考可以简化它。即使很难拥有不同版本的 Foo,也许 Foo 可以持有一个了解共享策略或具有不同子类的对象。请记住 Pascal 的这句话:“很抱歉我的信写得这么长。我没有时间把它写短。” - Eric Jablow
是的,我需要将这个类泛型化,但目前我只需要让我已有的代码能够正常工作! - Liam

2

我更喜欢第一个。我认为单行多个if的代码难以阅读。

抱歉,但我会投票关闭。这将是一场没有答案的辩论。


1
太棒了,谢谢!关闭它!似乎已经就此达成共识 :) - Liam

1

建议始终使用大括号,但是否有一种情况下不使用大括号更易读?

if(condition){

} else if (condition) {
    ...
}else if (condition3){

}

如果您总是使用大括号,那么它会像这样。可能我在某些地方犯了错误。
if(condition){

 } else{ 

       if (condition) {
             ...
       }else {

           if (condition3){

           }//end if
       }//end else
 }//end else

我认为使用的关键在于可读性,就像上面所说的,程序必须是为人们编写的,只有偶尔才会被机器执行。

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