【问题标题】:Java switch cases: with or without braces?Java switch 案例:带或不带大括号?
【发布时间】:2010-10-12 14:54:03
【问题描述】:

考虑以下两个带大括号的sn-ps:

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

我知道,在带大括号的 sn-p 中,通过将每个 case 括在大括号中来创建一个新的范围。但是,如果每个 case 都不需要新的范围(即没有变量名被重用),那么在 case 中使用大括号是否会降低性能?

【问题讨论】:

    标签: java performance switch-statement


    【解决方案1】:

    在案例中使用大括号是否会降低性能?

    无。

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

    【讨论】:

      【解决方案2】:

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

      从编译的角度来看,性能略有下降,因为要解析的内容更多,但如果有人真的担心这一点,他们将不得不将代码全部写在一行上 :-)

      现在对于我们帖子的意见部分...我总是把 { 和 } 放在可维护性上,因为您可能不得不在以后放入它们,这可能是一个稍后再放它们会很痛苦……但这是 103% 的个人喜好。

      【讨论】:

      • 我有点好奇,因为我自己看不到答案......@TofuBeer,你什么时候必须添加大括号?另外,我完全同意可维护性的观点,我只是没有看到可维护性问题 ATM。编辑:没关系。我刚刚阅读了下面的其余答案。
      • 在某些情况下你会使用 C++,所以如果你同时使用这两种语言,那么使用任何一种语言都不是一个坏习惯。
      【解决方案3】:

      我们知道,switch case 的大括号是不必要的。使用大括号 case 可能会导致对 case 范围的混淆。

      左大括号通常与一些有意义的东西相关联,例如函数的开始或循环的开始或类声明的开始或数组初始化的开始等......我们知道,当一个 case 发生时,它会从 switch 块中中断。遇到 break 语句。因此,对于无知的读者来说,使用花括号似乎意味着不同的 case 范围。因此,为了更好的编程可读性,最好避免使用花括号。

      即当我有类似的东西时,

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

      “Hello from 1”被打印出来。但是使用大括号可能会暗示一个无知的读者认为 case 以 '}' 结尾,因为他们已经知道在循环、方法等情况下大括号通常意味着什么。

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

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

      我的建议:只是避免在 switch case 中使用大括号。

      【讨论】:

      • 不同意这一点。使用大括号并在大括号外编写代码将是非常糟糕的形式,是的,但这并没有贬低大括号本身的使用。
      • 大括号是为了防止您在示例中提到的情况......
      • 但是大括号确实创建了一个新范围...
      【解决方案4】:

      带大括号。

      switch语句有很多可能出错的地方,我尽量避免它们,即

      1. 忘记休息,从而导致案例失败
      2. 忘记默认情况,因此不会捕获未满足条件的情况
      3. 意外地在 case 语句之间重用变量,或者更糟糕的是,影响了在 case 语句之间共享变量的变量。

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

      【讨论】:

      • 包括第 1 点和第 2 点对这个问题有误导性(对我而言);你的结束行应该明确地说大括号只能解决 3 - 我以为你的意思是大括号排除了休息的需要,然后尝试了。
      • 第 3 点甚至没有意义。除非它们在 switch 语句的父范围中声明,否则您不能重用变量。这意味着如果您在一个案例中声明一个变量,那么它就不能在另一个案例语句中使用。如果您在 switch 语句上方(在父范围内)声明一个变量,那么无论您是否使用大括号,case 语句都可以访问该变量。
      • 我刚刚(重新)发现在案例 1 中声明的变量仍然可以在案例 2 的范围内。例如:...case 1: int a = 10; break; case 2: int a = 11; break; ... 无法编译。 (使用 Oracle JDK 8 测试)
      【解决方案5】:

      这个问题可能会以“争论”(BRACE WAR!)的形式结束,但到底是什么。我实际上喜欢病例后的牙套。对我来说,它使丑陋的 switch 语法看起来更像其他语言结构。 (在这种“情况”中使用大括号不会受到惩罚)

      【讨论】:

      • 我想这是一个客观的问题......我收回争论的事情
      • 我更喜欢不带大括号的...我发现大括号会增加很多不必要的噪音。
      • 是的,我希望它更像这样:case(FOO){x=x+1} case(BAR){y=y+1}
      • 明智的空白 == 不错。不必要的大括号 == 糟透了。
      • 空白 == 制表符和空格的混合 == 糟透了(只是想我会在混合中加入制表符与空格的注释)
      【解决方案6】:

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

      大括号实际上最有用,可以确保您最终不会在不同的cases 中错误地重用相同的变量。他们今天没有声明任何变量,但是明天有人会添加它们,如果没有大括号,代码很容易出错。

      【讨论】:

        【解决方案7】:

        我不会在 switch case 中使用大括号。

        • switch 语句在没有大括号的情况下看起来已经足够巴洛克了。

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

        现在开始维护一些遗留的 C 代码,这些代码包含 500 多行的 switch case ...

        【讨论】:

          【解决方案8】:

          我以前从未想过。在 case 子句中从来不需要大括号,所以无法真正理解为什么需要它们。就我个人而言,我不赞成“它会更容易维护”的想法,那只是垃圾,如果代码有意义并记录在案,它会更容易维护。

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

          【讨论】:

          • { 和 } 也使事情脱颖而出,这使其更易于阅读 (IMO)。
          • 是的。我打算分享一个我曾经不得不修改的方法的故事(我花了大约 4 个小时来添加一行代码)但代码很疯狂(打印时大约 10 页长和 4 页宽)所以它不是典型案例。但如果它使用了 {},那么添加它需要一分钟。
          • 我认为关键在于,如果最初的程序员努力放入 {} 块以使代码更具可读性,他们可能实际上会关心他们在哪里编写 10 页切换声明并将代码更改为不那么疯狂
          • swtich 本来是一个梦想。它是嵌套的 if/elses ......由 COBOL 程序员用 C++ 代码编写的......在那之后不久我就退出了。
          猜你喜欢
          • 2011-12-28
          • 2015-05-08
          • 2011-04-08
          • 2017-01-22
          • 2023-03-03
          • 1970-01-01
          • 2018-03-16
          相关资源
          最近更新 更多