【问题标题】:Are there any similar statements that do the same job as the Switch Statement?是否有任何类似的语句与 Switch 语句完成相同的工作?
【发布时间】:2017-10-07 19:52:27
【问题描述】:

我是初学者,经常使用 switch 语句。有时使用它会变得很烦人。 Java 中是否还有其他语句可以像 switch 语句一样完成类似的工作?

【问题讨论】:

  • 你可以重构你的代码来减少开关的数量。这是不可能的,因为这里没有说明你的代码是做什么的。如果您想要一些可以插入并替换任何 switch 语句的东西——如果它的工作方式相同,结果会如何不那么烦人?
  • 是的,为什么不可以使用 if -else-if(ladder if) 语句,但 switch case 是最快的。
  • 发明多态是为了摆脱 switch 语句。

标签: java switch-statement


【解决方案1】:

替代方案是ifelse ifelse 的块。

如果对应的case 表达式不是编译时可评估的,这可能比switch 更可取。像我这样的纯粹主义者不喜欢在 Java 中使用 switch 处理字符串,而 C# 似乎正在转向一种范式,您可以在几乎任何东西上使用 switch

您还可以将更频繁发生的情况放在 if 块的顶部,并尽早剔除可能导致后续测试失败的条件,例如检查 null 的对象。

您也可以考虑使用三元条件链,但请注意它们在 Java 中具有奇怪的类型提升规则。

【讨论】:

    【解决方案2】:

    你可以使用 if 结构

    if (condition) {
      // do this
    } else if (condition2) {
      // do this
    } else {
      // do something else
    }
    

    如果你愿意,可以省略 else-if 或 else 部分

    【讨论】:

      【解决方案3】:

      有很多方法可以实现目标 - 这在很大程度上取决于具体情况。 显而易见的是 if-else,但有时 Map 是更好的选择。

      看到这个问题:How is this design pattern called? (map instead of switch)

      【讨论】:

      • 如果你打开一个非负的int,你有时可能会使用一个数组而不是地图。但是,保持数组的初始化可读和清晰并不容易。
      【解决方案4】:

      实际上,如果您只有两种情况,则视情况而定,那么您可以使用三元运算符('?')。
      但是,是的,您可以通过使用多态性和继承来进行重构。 像这样,

          // *** With switch ***
          class Car {
            //...
            double getSpeed() {
              switch (type) {
                case BMW:
                  return 250;
                case AUDI:
                  return 200;
                case SUZUKI:
                  return 300;
              }
            }
          }
      
      
      
          // *** Without switch *** Create Abstract class
          abstract class Car {
            abstract double getSpeed();
          }
      
          class BMW extends Car {
            double getSpeed() {
              return 250;
            }
          }
          class Audi extends Car {
            double getSpeed() {
              return 200;
            }
          }
          class suzuki extends Car {
            double getSpeed() {
              return 300;
            }
          }
      
      
          // simple use
          speed = Car.getSpeed();
      

      【讨论】:

        猜你喜欢
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多