Java切换案例:是否带有花括号?


85

考虑以下两个带有花括号的代码段:

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

我知道,在带有大括号的代码段中,通过将每个案例放在大括号中创建了一个新的作用域。但是,如果每种情况都不需要新的作用域(即,没有重用变量名),那么将大括号与案例一起使用是否会对性能造成任何影响?

Answers:


99

在使用大括号的情况下会有任何性能损失吗?

没有。

花括号可以帮助编译器确定变量,条件,函数声明等的范围。将代码编译成可执行文件后,它不会影响运行时性能。


21

从执行角度来看,没有性能损失。

从编译的角度来看,性能会有轻微的损失,因为还有更多要解析的内容,但是如果实际上有人担心它,则必须将所有代码全部写在一行上:-)

现在,对于我们帖子的观点部分,...我总是放在{和}中,因为对可维护性有一个惩罚,因为您可能必须稍后再将它们放入,将它们放入可能会很痛苦稍后...但这是103%的个人偏好。


我有点好奇,因为我自己看不到答案... @TofuBeer,您什么时候可以添加括号?另外,我完全同意可维护性观点,只是看不到ATM的可维护性问题。编辑:没关系。我只是阅读了下面的其余答案。
nyaray

在某些情况下,您使用C ++进行操作,因此,如果您同时使用这两种语言,则不妨养成使用这两种语言的习惯。
TofuBeer

13

如我们所知,没有必要为开关盒配备支架。使用花括号案例可能会引起案例范围的混淆。

大括号通常与有意义的东西相关联,例如函数的开始,循环的开始,类的声明的开始或数组初始化的开始等。声明。因此,对于无知的读者来说,使用花括号似乎暗示着大小写范围的不同。因此,最好避免使用花括号以提高程序可读性。

即当我有类似的东西时,

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

  case 2: 
  ....
}

打印“来自1的Hello”。但是使用花括号可以暗示一个无知的读者,该案例以'}'结尾,已经知道在循环,方法等情况下花括号通常表示什么。

就像我们在“ C”中有跳转到标签的语句一样,控件只是转换为大小写并继续执行。因此,基于这种理解,在编写用于切换的案例时使用花括号只是一种糟糕的做法。

从技术上讲,当与有效语法一起使用时,可以用一对大括号将代码的任何块括起来。至少在我看来,在开关中使用括号似乎很糟糕,因为它给人的感觉就像我上面所说的那样。

我的建议:避免在开关盒中使用括号。


5
不同意这一点。是的,使用大括号并在大括号之外编写代码是非常糟糕的形式,但这并不会使大括号本身的使用受到损害。
Max Roncace

12

带牙套。

switch语句有很多地方可能出错,因此我会尽量避免使用它们,即

  1. 忘记休息,因此遇到失败的情况
  2. 忘记默认案例,因此不捕获未分类的条件
  3. 意外重用案例语句之间的变量,或者更糟的是,影响了在案例语句之间共享变量的变量。

使用花括号是一种防止案例语句之间有意和无意共享变量的方法


8
在我看来,包括点1和点2会误导这个问题;您的结束语应该明确指出括号可以解决3个问题-我认为您的意思是括号排除了休息的必要,然后尝试了一下。
2013年

第三点甚至没有意义。除非在switch语句的父作用域中声明了变量,否则您不能重复使用它们。这意味着,如果您在一个case中声明一个变量,则不能在另一个case语句中使用它。如果在switch语句上方(在父作用域中)声明一个变量,则是否使用大括号都没关系,case语句将有权访问该变量。
dsingleton 2014年

我只是(重新)发现,在情况1中声明的变量在情况2中仍然可以包含在范围内。例如:...case 1: int a = 10; break; case 2: int a = 11; break; ...无法编译。(已通过Oracle JDK 8测试)
anuragw

5

这个问题可能会以“议论性”(BRACE WAR!)结束,但是到底是什么。我实际上很喜欢案件之后的牙套。对我来说,它使丑陋的切换语法看起来更像其他语言构造。(在此“案例”中使用花括号没有任何惩罚)


我想这是一个客观的问题……我撤消了有争议的事情
安迪·怀特

我更喜欢不带牙套...我发现牙套会增加很多不必要的噪音。
cdmckay,2009年

是的,我希望它更像这样:case(FOO){x = x + 1} case(BAR){y = y + 1}
Andy White

合理的空格==不错。不必要的括号==糟透了。
Shog9,2009年

3
空格==制表符和空格的混合==很烂(只是以为我会在混音中加入制表符和空格的注释)
Andy White

5

您说括号可以省略,因为没有变量名被重用。通过重用变量名,我假设您的意思是声明一个相同类型的新变量。

花括号实际上最有用的是确保您最终不会case误用相同的变量。他们今天没有声明任何变量,但是明天有人会添加它们,并且没有花括号,代码容易出错。


3

我不会在开关盒中使用大括号。

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

  • 开关盒应非常短。当您需要声明变量时,这表明您做错了。

现在要维护一些旧的C代码,这些代码可以切换500多个行的情况...


1

我从来没有想过。从来不需要case子句中的花括号,因此无法真正理解为什么需要它们。就我个人而言,我不赞成“将更易于维护”的想法,这只是垃圾,如果代码有意义并被记录下来,则将更易于维护。

没有大括号...语法越少越好


{和}也会使内容脱颖而出,这使其更易于阅读(IMO)。
TofuBeer

对。我将分享一个我曾经不得不修改的方法的故事(花了我大约4个小时来添加一行代码),但是代码太疯狂了(打印时大约10页长,4页宽),所以它不是典型案例。但是,如果使用{},则将花费一分钟的时间来添加它。
TofuBeer

我认为这里的要点是,如果原始程序员努力投入{}块以使代码更易读,那么他们实际上可能会在意写10页switch语句并将代码更改为少一点疯狂
Gareth Davis

swtich真是一个梦想..如果/其他...嵌套,由COBOL程序员用C ++代码编写...在那之后不久我退出了。
TofuBeer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.