【问题标题】:Java Switch StatementJava 切换语句
【发布时间】:2013-07-23 15:46:00
【问题描述】:

当我尝试处理特殊情况时,我在使用 switch 语句时遇到了问题。 例如, 我有 3 种情况:A、B、C。

  • 对于A,我想做statement_1和statement_3。
  • 对于 B,我想做 statement_2 和 statement_3。
  • 对于 C,我什么都不想做

如果我使用 if-else 语句,它将如下所示:

 if ( not C){
    do statement_3

   if B
      do statement 2
   else if A
      do statement 1

 }

如果我想用 switch 语句来做同样的事情,我就有麻烦了。

switch (variable){
case A:  do statement_1
case B: do statement_2
// how to do statement 3 here?  
}

我试图避免重复的代码。所以我在想如何让代码尽可能简单。

更新一:

  1. 为了让我的代码/问题更清楚,我只想让我的代码 尽可能简单/清晰,这就是我想使用 switch 语句的原因 而不是 if-else。另外,我听说 switch-statement 通常是 比 if-else 快。 (虽然我不是 100% 确定)。

  2. 我想使用 switch-case,因为 Case A、B、C 是枚举类型。他们 不可变。很抱歉造成混乱。

  3. 每个语句都超过 10 行代码。这就是为什么我不想做以下事情:

    switch (enum variable) {
    case A:
      statement1
      statement3
     break;
    case B:
      statement2
      statement3
     break;
    

    }

【问题讨论】:

  • 这段代码不起作用,因为 Java 6 和更早的版本需要一个原始类型的值。 Java 7 可以处理字符串。
  • switch 不好 - 你不能跳过案例,这是你必须做的,以避免对 statement_3 的调用编码两次
  • if 有什么问题?如果开关不是正确的工具,请不要使用它。大多数时候,它不是正确的工具。
  • 我觉得if也不错……

标签: java if-statement switch-statement


【解决方案1】:

我建议准确定义应该执行的语句:

switch (variable){
    case A: 
        statement_1();
        statement_3();
        break;
    case B: 
        statement_2();
        statement_3();
        break;
}

对于 Update-3:

为这 10 行创建方法:

public void statement_1() {
    //your 10 lines of code
}

如果您总是在执行 statement_3,除了 case C,您可以在编写时使用 if/else-blocks。

但老实说: 如果您有少量案例,请准确定义在这种情况下必须做什么。 其他人更容易阅读

【讨论】:

    【解决方案2】:

    你可以这样做:

    switch (variable){
      case A:  do statement_1; do statement_3; break;
      case B:  do statement_2; do statement_3; break;    
    }
    

    【讨论】:

      【解决方案3】:

      为什么不将 switch 嵌套在 if 语句中?这样就没有重复代码了。

      if(!C){
          statement_3;
          switch(variable){
          case A:
              statement_1;
              break;
          case B: 
              statement_2;
              break;
      }
      

      或者同时使用 if 语句和 switch?

      if(!C){
          statement_3;
      }
      switch(variable){
      case A:
          statement_1;
          break;
      case B: 
          statement_2;
          break;
      

      【讨论】:

      • 但是为什么要使用带有 2 个外壳的开关并将它们混合在一起呢?你没有获得性能或任何东西。这可能会让其他开发者感到困惑
      • 因为使用switch语句提到的问题。如果只有 2 或 3 例,那么 if-elseif-else 是要走的路。但是如果有一组语句都共享相同的代码,比如说几十次但不是在一个场景下,为什么要在切换之前执行代码时重复代码(只要不满足某个条件) ?
      【解决方案4】:

      我经常发现引入enums 可以增加清晰度。在这里,我想每个enum 都是一个可以通过多个过程解决的问题:

      enum Issue {
        A {
          void handleIt () {
            statement_1();
            statement_3();
          }
        },
        B {
          void handleIt () {
            statement_2();
            statement_3();
          }
        },
        C {
          void handleIt () {
            // Do nothing.
          }
        },
        D {
          void handleIt () {
            A.handleIt();
            B.handleIt();
          }
        };
      
        abstract void handleIt();
      }
      

      请注意,您可以获得额外的好处,即能够使用其他问题的解决方案来处理某些问题(请参阅我的Denum)。

      【讨论】:

        【解决方案5】:

        如果一个案例有超过 2-3 条语句,最好(从可读性和简洁代码的角度)将它们提取为单独的方法:

        switch (variable){
            case A: handleCaseA(); break;
            case B: handleCaseB(); break;
            default: handleDefaultCase(); break;
        }
        

        【讨论】:

          【解决方案6】:
          switch (variable) {
          case A:  
          do statement_1;
          do statement_3;
          break;
          case B:
          do statement_2;
          do statement_3;
          break;
          }
          

          【讨论】:

          【解决方案7】:

          使用 Java 12 switch-expressions 你可以很好地做到以下几点:

          switch (variable) {
                  case A -> statement_1();
                            statement_3();
                  case B -> statement_2();
                            statement_3();
          };
          

          【讨论】:

            【解决方案8】:

            当您使用“case”时,首先使用 switch 语句,并确保其中有一个已初始化的变量。这是一个例子。

            使用初始化变量:即

            (String s=sc.nextLine();)
            
                    switch (s) {
                    case "Pepperoni":
                        System.out.println("Pepperoni? Nice choice. Please wait............Ding! Here's your pepperoni pizza. Enjoy, and thanks for using the Local Pizzeria!");
                    case "Cheese":
                        System.out.println("Cheese? Okay! Soft cheese it is! Please wait............Ding! Here's your cheese pizza. Enjoy, and thank you for using the Local Pizzeria!");
                        break;
                    case "Mushrooms":
                        System.out.println("Mushrooms? Veggie person, right? OK! Please wait............Ding! Here's your mushroom pizza. Enjoy, and thanks for using the Local Pizzeria!");
                        break;
                    case "Beef Bits":
                        System.out.println("Beef bits? Like meat? Alright! Please wait............Ding! Here's your beef bit pizza. Enjoy, and thank you for using the Local Pizzeria!");
            
                        break;
                    case "Spicy Buffalo Chicken":
                        System.out.println("Spicy buffalo chicken? Way to spice things up! Please wait............Ding! Here's your spicy buffalo chicken pizza. Enjoy, and thank you for using the Local Pizzeria!");
                        break;
                    case "Exit":
                        System.out.println("See you soon!");
                    }
                }
            

            【讨论】:

              【解决方案9】:

              这里你必须以这种方式使用if statement,因为在switch中通常也有default的值。

                  if (letter == 'A' || letter == 'B') { System.out.println("Statement 3 ");}
              
              switch (letter) {
                          case 'A':
                              System.out.println("Statement 1 ");
                              break;
              
                          case 'B':
                              System.out.println("Statement 2 ");
                              break;
              
                          case 'C':
                              System.out.println();
                              break;
                          default:
                              System.out.println("You entered wrong value");
              }       
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-06-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多