如果我在Java中省略花括号,这样可以吗?

时间:2011-11-05 12:42:36

标签: java coding-style brackets

我已经搜索过这个,但无法找到答案,无论出于什么原因,我都羞于问教授,因为有数百人盯着你的感觉......

无论如何,我的问题是拥有括号的重要性是什么?如果我省略它们可以吗?例如:

for (int i = 0; i < size; i++)  {
   a += b;
}

VS

for (int i = 0; i < size; i++)
   a += b;

我知道他们两个都可以工作,但是如果我省略括号(我倾向于做很多,由于可见性)会改变什么,什么都没有?正如我所说,我知道它有效,我测试了十几次,但现在我的一些单一任务变得越来越大,并且出于某种原因,我有非理性的恐惧,从长远来看,这是我的原因有些问题吗?有理由害怕吗?

16 个答案:

答案 0 :(得分:120)

除了代码的可维护性之外,它不会改变任何。我见过这样的代码:

for (int i = 0; i < size; i++)
   a += b;
   System.out.println("foo");

这意味着:

for (int i = 0; i < size; i++)
   a += b;
System.out.println("foo");

...但 应该是

for (int i = 0; i < size; i++) {
   a += b;
   System.out.println("foo");
}

我个人总是包含括号,以减少阅读或修改代码时出现混淆的可能性。

我所工作的每家公司的编码惯例都要求这样做 - 这并不是说其他​​公司没有不同的约定......

以防你认为它永远不会有所作为:我必须修复一次与上面的代码完全相同的错误。很难发现......(不可否认,这是几年前,在我开始进行单元测试之前,这无疑会使诊断变得更容易)。

答案 1 :(得分:30)

使用大括号使代码更易于维护和理解。因此,您应该将它们视为默认

我有时会跳过使用guard clauses上的大括号来使代码更紧凑。我对此的要求是它们是if语句,后跟 jump 语句,如returnthrow。另外,我把它们放在同一行,以引起对成语的注意,例如:。

if (!isActive()) return;

它们也适用于循环内的代码:

for (...) {
  if (shouldSkip()) continue;
  ...
}

对于其他不一定位于方法体顶部的方法的跳转条件。

某些语言(如Perl或Ruby)有一种条件语句,其中大括号不适用:

return if (!isActive());
// or, more interestingly
return unless (isActive());

我认为它与我刚刚描述的等同,但是语言明确支持。

答案 2 :(得分:10)

没有区别。第二个版本的主要问题是你最终可能会写这个:

for (...) 
  do_something();
  do_something_else();

更新该方法时,认为在循环内调用了do_something_else()。 (这会导致令人头疼的调试会话。)

支架版本没有第二个问题,可能更难发现:

for (int i=0; i<3; i++);
  System.out.println("Why on earth does this print just once?");

除非你有充分的理由,否则请保留括号,只需点击几下。

答案 3 :(得分:4)

如果您只有一个语句,则可以省略括号,因为声明一个代码块需要更多的语句括号。

当您使用括号时,您将声明一段代码:

{

//Block of code
}

当你处于嵌套语句的情况下时,括号也应该只用一个语句以提高可读性,例如:

for( ; ; )
  if(a == b) 
    doSomething()

如果没有必要,用括号书写的更易读:

for( ; ; ) {
  if(a == b) {
    doSomething()
   }
}

答案 4 :(得分:4)

如果使用括号,则代码更具可读性。 如果您需要在同一个块中添加一些运算符,则可以避免可能的错误

答案 5 :(得分:4)

我认为如果你也使用自动格式,那么松散的花括号是好的,因为你的缩进总是正确的,所以很容易发现任何错误。

说离开花括号是坏的,奇怪的或不可读的是错的,因为整个语言都是基于这个想法,并且它很受欢迎(python)。

但我必须说,如果不使用格式化程序,它就会很危险。

答案 6 :(得分:4)

对于大多数情况,到目前为止提到的答案是正确的。但从安全角度来看,它有一些缺点。在支付团队工作之后,安全性是推动此类决策的更强大因素。假设您有以下代码:

-webkit-appearance: none;
-moz-appearance: none;
appearance: none;

现在让我们假设您的代码由于某些内部问题而无效。您想检查输入。所以你做了以下改变:

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )

假设您已解决问题并部署此代码(也许是评论者和您认为这不会导致问题,因为它不在'Prod'条件下)。奇怪的是,您的生产日志现在会打印客户信用卡信息,这些信息对于可以查看日志的所有人员都是可见的。如果他们中的任何人(有恶意)意图掌握这些数据,上帝就会禁止。

因此,不提供支架和一些粗心的编码往往会导致安全信息的泄露。它也被CERT - Software Engineering Institure, CMU归类为JAVA中的漏洞。

答案 7 :(得分:3)

使用括号将来证明代码以防后续修改。我已经看到了省略括号的情况,后来有人添加了一些代码,并且当时没有放括号。结果是他们添加的代码没有进入他们认为的部分。所以我认为答案是它的良好实践,因为未来的代码变化。我已经看到软件组采用它作为标准,即由于这个原因,即使使用单行块也总是需要括号。

答案 8 :(得分:2)

更多支持&#34;总是括号&#34;来自我的团队。 如果您省略了单语句循环/分支的大括号,请将语句放在与控制语句相同的行上,

if (condition) doSomething();
for(int i = 0; i < arr.length; ++i) arr[i] += b;
这样,当身体扩张时,忘记插入牙箍会更加困难。不过,无论如何,请使用curlies。

答案 9 :(得分:1)

结果明智,这是一回事。

只需要考虑两件事。

- 代码可维护性
  - 松散耦合的代码。 (可以执行    别的。因为你还没有指定循环的范围。 )

注意:在我的观察中,如果它是循环中的循环。没有支撑的内环也是安全的。结果不会有所不同。

答案 10 :(得分:1)

如果循环中只有一个语句,则它是相同的。

例如,请参阅以下代码:

for(int i=0;i<4;i++)
            System.out.println("shiva");

我们在上面的代码中只有一个语句。所以没问题

for(int i=0;i<4;i++)
            System.out.println("shiva");
            System.out.println("End");

这里我们有两个语句,但只有第一个语句进入循环内部而不是第二个语句。

如果在单循环下有多个语句,则必须使用大括号。

答案 11 :(得分:1)

如果删除大括号,它只会读取第一行指令。不会读取任何其他行。如果要执行的指令行超过1行,请使用大括号 - 否则将抛出异常。

答案 12 :(得分:1)

使用冗余括号声称代码更易于维护引发了以下问题:如果那些人写作,想知道并进一步维护代码有类似前面描述的问题(缩进相关或可读性相关),也许他们不应该编程所有...

答案 13 :(得分:0)

它也应该是对代码进行重新格式化的反射......这当然是专业团队中的专业程序员

答案 14 :(得分:0)

最好在任何地方都使用花括号,因为调试这个问题会带来极大的麻烦。但另一方面,一行代码并不一定需要括号。希望这有帮助!

答案 15 :(得分:0)

如今,重新缩进代码非常容易找出哪个代码块位于iffor / while中。如果你坚持认为重新缩进很难做到,那么错误缩进的括号可能会让你感到困惑。

for(int i = 0; i < 100; i++) { if(i < 10) {
    doSomething();
} else { for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}}

如果你到处都这样做,你的大脑很快就会崩溃。即使使用括号,您也可以通过缩进来直观地找到代码块的开头和结尾。

如果缩进很重要,那么您应该已经在正确的缩进中编写代码,因此其他人不需要重新缩进代码以正确读取。

如果你想争辩说前面的例子过于伪造/故意,并且括号是为了捕捉不小心的缩进问题(特别是当你复制/粘贴代码时),那么请考虑一下:

for(int i = 0; i < 100; i++) {
    if(i < 10) {
    doSomething();
}
else {
    for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}

是的,它看起来不如前面的例子那么严重,但你仍然会因为这种缩进而感到困惑。

恕我直言,编写代码的人有责任检查代码并确保在继续执行其他操作之前缩小了内容。