【问题标题】:Java: Can I fall through only one case in a switch statementJava:我可以在 switch 语句中只遇到一种情况吗
【发布时间】:2013-03-25 02:08:47
【问题描述】:

在 Java 中,我可以在 switch 语句中只遇到一种情况吗?我明白,如果我break,我会一直坚持到switch 声明的结尾。

这就是我的意思。给定以下代码,在案例 2 上,我想执行案例 2 和案例 1。在案例 3 上,我想执行案例 3 和案例 1,但不执行案例 2。

switch(option) {
    case 3:  // code
             // skip the next case, not break
    case 2:  // code
    case 1:  // code
}

【问题讨论】:

  • 试着给出不同的命令来切换语句并应用 break 和 without break 语句,看看会发生什么
  • 有趣的想法,但有点像goto

标签: java switch-statement


【解决方案1】:

不,switch 语句无法实现您所追求的。您将通过每个case,直到您击中break。也许您希望 case 1 位于您的 switch 语句之外,以便无论如何都执行它。

【讨论】:

  • 在每个案例的行为总是包含后续案例的所有行为的情况下,使用 fall-through 是合适的。如果每个案例的操作是某个行为池的不同子集,则方法调用 + break 语句是合适的。
【解决方案2】:

将代码放入方法并酌情调用。按照你的例子:

void case1() {
    // Whatever case 1 does
}

void case2() {
    // Whatever case 2 does
}

void case3() {
    // Whatever case 3 does
}

switch(option) {
    case 3:
        case3();
        case1();
        break;
    case 2:
        case2();
        case1();
        break;
    case 1: 
        case1();   // You didn't specify what to do for case 1, so I assume you want case1()
        break;
    default:
        // Always a good idea to have a default, just in case demons are summoned
}

当然,case3()case2()... 是非常糟糕的方法名称,您应该重命名为更有意义的方法来实际执行的操作。

【讨论】:

  • 这绝对是他应该做的,考虑到想要的结果(并且希望使用switch)。
【解决方案3】:

我的建议是不要对任何事情使用fallthrough,除了以下情况:

switch (option) {
    case 3:
        doSomething();
        break;
    case 2:
    case 1:
        doSomeOtherThing();
        break;
    case 0:
        // do nothing
        break;
}

也就是说,给几个案例确切相同的代码块来处理它们(通过“堆叠”case 标签),使这里的流程或多或少很明显。我怀疑大多数程序员会直观地检查大小写是否漏掉(因为缩进使大小写看起来像一个正确的块)或者是否可以有效地读取依赖它的代码 - 我知道我没有。

【讨论】:

    【解决方案4】:
    switch(option) 
    {
        case 3:
            ...
            break;
        case 2: 
            ...
            break;
    }
    
    ... // code for case 1
    

    【讨论】:

    • nicholas.hauschild 的答案副本。
    • @m0skit0 看到 nicholas 的答案没有提供代码,这个答案将信息添加到整个“线程”中。我认为参加 SO 上的土地抢夺没有任何问题,它不是 wiki,您可以改进其他人的答案。优点应该比一些模糊的“公平”概念更重要,而且投票通常有利于那些更早发布答案的人,迟到的基本上相同的副本很可能最终被埋没。 (就像这里的情况一样。)
    • @millimoose 我理解并同意,感谢您指出这一点。
    【解决方案5】:

    如果您想拆分案例,您可以自定义条件

    const { type, data } = valueNotifications
    
        let convertType = ''
        if (data?.type === 'LIVESTREAM' && type === 'NORMAL') { 
          convertType = 'LIVESTREAM1' 
        } else convertType = type 
    
        switch (convertType) 
    

    我的用例已将类型与值通知分开,但我有一个特定的 LiveStream 案例,它仅在 data.type 中显示为“LIVESTREAM”

    【讨论】:

      【解决方案6】:

      可能是这样的。

      switch(option) {
          case 3:  // code
                   // skip the next case, not break
              // BLOCK-3
          case 2:  // code
              if(option == 3) break;
              // BLOCK-2
          case 1:  // code
              // BLOCK-1
      }
      

      【讨论】:

      • case 2: if(option == 3) break;你在召唤恶魔!
      【解决方案7】:

      在 switch 语句中如果你不break 则执行后续的情况。举个简单的例子

          int value = 2;
          switch(value) {
          case 1: 
              System.out.println("one");
              break;
          case 2: 
              System.out.println("two");
          case 3: 
              System.out.println("three");
              break;
          }
      

      会输出

      two
      three
      

      因为break 不想在案例 2 上执行

      【讨论】:

      • 来自问题:“在案例3上,我要执行案例3和案例1”
      • 这是一个关于 switch 语句如何工作的简单示例。不是直接回答。我们不希望一直在 SO 上复制和粘贴答案,对吗?
      • 但我们确实想要问题的答案:)
      猜你喜欢
      • 1970-01-01
      • 2013-05-13
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多