Java切换案例:带或不带大括号?

考虑下面的两个代码片段,用大括号表示:

switch (var) { case FOO: { x = x + 1; break; } case BAR: { y = y + 1; break; } } 

没有牙套:

 switch (var) { case FOO: x = x + 1; break; case BAR: y = y + 1; break; } 

我知道,在带有大括号的片段中,通过将每个大括号括起来创build一个新的作用域。 但是,如果每个案例都不需要新的范围(即没有variables名称被重用),那么在使用大括号的情况下会有什么样的性能损失?

使用大括号的情况下是否有任何性能损失?

没有。

花括号用于帮助编译器找出variables,条件,函数声明等的范围。一旦将代码编译为可执行文件,它不会影响运行时的性能。

这是过早优化的一个极端例子。 这是一个更好的主意,担心哪种方式更容易阅读和debugging。

从执行的angular度来看性能不会受到影响。

从编译的angular度来看,性能会有轻微的下降,因为还有更多需要parsing的东西,但是如果有人真的担心这个问题,他们将不得不把代码写在一行上:-)

而现在对于我们这个post的意见部分…我总是把{和}放进去,因为可维护性会受到一定的惩罚,所以你可能不得不在晚些时候把它们放进去,在后来…但这是103%的个人喜好。

正如我们所知道的,开关盒的大括号是没有必要的。 使用大括号的情况下可能会导致一个案件的范围混淆。

一个开放的大括号通常与一些有意义的东西相关联,例如函数的开始或循环的开始,类的声明的开始或者数组的初始化等等。我们知道,当遇到中断时,声明。 因此,使用花括号似乎意味着对于一个无知的读者而言,情况的范围不同。 所以,为了更好的编程可读性,最好避免使用花括号。

即当我有类似的东西,

 switch(i) { case 1 : { //do something } System.out.println("Hello from 1"); case 2: .... } 

“你好从1”被打印。 但使用大括号可能暗示一个无知的读者,以'}'结尾,已经知道大括号通常表示在循环,方法等情况下。

就像我们在“C”中跳转到标签语句一样,控制转移到大小写并继续执行。 所以,有了这样的理解,在编写切换案例时使用大括号就是一个坏习惯。

从技术上讲,当你使用有效的语法时,你可以使用额外的花括号来包围代码块。 在开关中使用大括号看起来如此糟糕,至less对我来说,因为它似乎有一个不同的感觉,就像我上面所说的。

我的build议:只要避免使用周围的大括号开关案件。

带着大括号。

switch语句有很多事情可能会出错,我尽量避免它们,也就是说,

  1. 忘记rest,因此有案件的突破
  2. 忘记一个默认的情况下,因此不捕捉一个不适合的条件
  3. 意外重复使用case语句之间的variables,或者更糟糕的是,影响variables在case语句之间共享一个variables。

使用大括号是防止在案件陈述之间有意和无意共享variables的一种方法

这个问题可能会被视为“议论性的”(BRACE WAR!),但到底是什么。 我其实很喜欢这个案子之后的大括号。 对我来说,这使丑陋的开关语法看起来更像是语言结构的其余部分。 (在这种情况下使用括号是没有惩罚的)

你说花括号可以省略,因为没有variables的名字被重用。 通过重用variables名,我假设你的意思是声明一个新的variables相同的types。

大括号实际上是最有用的,以确保您不会错误地在不同case重复使用相同的variables。 他们今天没有声明任何variables,但有人会明天添加它们,没有大括号的代码是容易出错的。

我不会使用大括号开关案件。

  • 开关语句看起来已经足够巴洛克式了,没有大括号。

  • 开关盒应该很短。 当你需要声明variables时,这是一个标志,你做错了。

现在closures维护一些遗留的C代码,其中包含500多行的切换案例…

我从来没有想过。 从来没有需要大括号在案件条款,所以不能真正明白为什么你会需要他们。 就我个人而言,我不会去“维护起来会更容易”,只是垃圾,如果代码有意义并且有文档logging,维护起来会更容易。

没有大括号…语法更less