如果我省略了Java中的大括号可以吗?

我find了这个,但找不到答案,无论出于何种原因,我都很惭愧地问教授,因为这种感觉,当数百人盯着你时…

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

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

VS

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

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

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

 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"); } 

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

在我工作过的每家公司,编码惯例都要求这样做 – 这并不是说其他​​一些公司没有不同的惯例。

而且万一你认为它永远不会有所作为:我必须修复一个与上面的代码非常相当的错误。 很难发现…(不出所料,这是几年前,我开始进行unit testing之前,这无疑更容易诊断)。

使用大括号使代码更易于维护和理解。 所以你应该默认考虑它们。

我有时候会跳过对警卫子句使用大括号来使代码更紧凑。 我的要求是,他们是if后面是跳转语句,如returnthrow语句。 另外,我把它们放在同一句话中以引起对这个成语的注意,例如:。

 if (!isActive()) return; 

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

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

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

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

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

我认为这与我刚才所描述的相同,但是明确地受到这种语言的支持。

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

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

当你更新该方法时,认为do_something_else()在循环中被调用。 (这会导致头痛的debugging会话。)

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

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

所以,除非你有一个很好的理由,否则只要保留大括号,这只是一些击键。

我没有看到公约的重点。

总是使用大括号的原因是相当薄弱的,因为它假定程序员知道语言语法,并且知道没有大括号的if语句仅适用于跟在它后面的第一个语句。

如果Oracle决定这是一个“良好的做法”,那么总是使用大括号来编写if语句,那为什么他们不改变语法呢?

我的想法:

如果我写一个“没有大括号的声明”,我总是把它放在一行。 放两行这种代码很奇怪:

 if(statement) code; // weird and ugly for me. if(statement) code; // ok for me, I often use in very short codes. // but if the code is long, so I prefer the code below. if(statement) { code; // if this makes your code clear, then ok. // But there is cases when I think the second option is better. } 

我不喜欢基于这样愚蠢的理由的公约。

补充:在这篇文章中很多人都同意:你应该这样做,以提高可读性。 但我认为这样做是为了避免错误是不必要的。

你是否认为改变这样的代码:

 while(statement) { if (condition) i++; } 

进入这个:

 while(statement) { if (condition) { i++; } } 

会提高可读性? 我不这么认为。 这可能是一个更复杂的if语句。 但是我所认识的每个人都只用简单的if语句就可以这样编码。 不用说,第一个案子看起来更清楚。

但有人认为有一些程序员可以这样做:

 while (statement) { if (condition) i++; statement; } 

认为这个陈述是if的一部分。 我觉得没有必要担心这个。 因为如果一些程序员有这样的能力,那就更糟了。

我认为,应该避免的是写一个没有大括号的if语句像这样的两行:

 while (statement) { if (condition) i++; statement; } 

或嵌套unbraces声明,如:

 while (statement) if (condition) i++; 

这我同意它的错误容易,而且经常由初学者完成。 你应该避免编写复杂的,如果没有大括号相似的陈述。

如果你有一个单独的语句,你可以省略括号,为了声明一个代码块,需要更多的语句括号。

当你使用方括号时,你声明了一个代码块:

 { //Block of code } 

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

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

如果不是必须的话,用括号写的更具可读性:

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

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

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

说离开大括号是坏的,怪异的或不可读的只是错误的,因为整个语言是基于这个想法,它是相当stream行(python)。

但是我不得不说,如果不使用格式化程序,可能会很危险。

使用括号将来可以certificate这些代码是针对以后的修改的。 我已经看到了括号被省略的情况,并且有人后来添加了一些代码,并没有把括号放在那个时候。 结果是他们添加的代码并没有进入他们认为的那个部分。 所以我觉得答案就是根据未来对代码的修改,这是一个很好的实践。 我已经看到软件组采用这个标准,即因为这个原因,总是要求使用括号。

对于大多数情况,迄今为止提到的答案是正确的。 但是从安全的angular度来看,它有一些缺点。 在一个支付团队工作,安全是一个更强大的因素,动机这样的决定。 比方说你有以下代码:

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

现在让我们说你有这个代码不工作,由于一些内部问题。 你想检查input。 所以你做了以下的改变:

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

假设你解决了这个问题并且部署了这个代码(也许这个评论者&你认为这不会导致一个问题,因为它不在'Prod'条件之内)。 神奇的是,您的生产日志现在打印客户的信用卡信息,所有可以看到日志的人员都能看到。 上帝禁止他们(有恶意的意图)获得这些数据。

因此,不给大括号和粗心大意的编码往往会导致违反安全的信息。 它也被CERT(软件工程研究所)列为JAVA中的一个漏洞。

更多的支持我的“总是大括号”小组。 如果省略单语句循环/分支的大括号,则将该语句放在与控制语句相同的行上,

 if (condition) doSomething(); for(int i = 0; i < arr.length; ++i) arr[i] += b; 

这种方式很难忘记在扩展主体时插入大括号。 不过,仍然使用curl。

结果明智,这是一回事。

只有两件事情要考虑。

– 代码可维护性
– 松耦合的代码。 (可能会执行其他操作,因为您没有指定循环的范围。)

注意:在我看来,如果是在一个循环中循环。 没有牙套的内环也是安全的。 结果不会变化。

如果你删除大括号,它只会读取第一行的指令。 任何额外的行将不会被读取。 如果你有超过1行的指令被执行,请使用大括号 – 否则会抛出exception。

如果你在循环中只有一个语句,它是一样的。

例如看下面的代码:

 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"); 

在这里,我们有两个陈述,但只有第一个陈述进入循环,而不是第二个陈述。

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

使用冗余大括号声称代码更易于维护提出了以下问题:如果编写代码的人想知道并进一步维护代码,就会遇到类似前面所述的问题(缩进相关或可读性相关),也许他们不应该编程。 。

它应该是一个reflection,以重新格式化的代码…这当然是专业团队的专业程序员

这可能是最好的使用大括号到处,简单的事实是,debugging这将是一个极端的麻烦。 但是另一方面,一行代码不一定需要括号。 希望这可以帮助!