【问题标题】:How to achieve a switch case block which is scalable?如何实现可扩展的 switch case 块?
【发布时间】:2014-07-26 01:22:53
【问题描述】:

在开始构建应用程序时,我盯着只需要考虑五个案例的 switch case 块。后来随着构建的进行,更多的案例浮出水面,这开始产生问题。我知道我可能一开始就设计错了,但如果这样的事情发生了变化,我该如何有效地解决这个问题?下面给出一个例子

从这里开始

switch case 1: /*do function1()*/ break;
       case 2: /*do function2()*/ break;

后来,100个病例进来

switch case 1: /*do function1()*/ break;
       case 2: /*do function2()*/ break;
       ....
       case 100: /*do function100()*/ break;

我确信将这些情况转换为 100 如果条件不是一个很好的方法,那么有没有办法可以做到这一点?

请考虑上面代码中给出的函数现在是简单的数学函数。

【问题讨论】:

  • 您可以提取所有这些块以分离具有清晰独特名称的方法。
  • 根据您的代码,您可以使用Map 来存储函数(使用适当的接口)。
  • @Stultuske 谢谢,这样我就必须同时管理条件和方法,不是吗?
  • 这是你的代码,所以你当然需要管理它。但是读几百个 if else if 语句会容易得多

标签: java switch-statement conditional-statements


【解决方案1】:

考虑这样的界面:

public interface MyFunction {
    public void compute();
}

还有一个Map,将之前的接口作为值:

Map<Integer,MyFunction> myFunctionsMap = new HashMap<>();

您需要使用所有功能初始化地图:

myFunctionsMap.put(1,new MyFuntion() {
    @Override
    public void compute() {
        /*do function1()*/
    }
});

对于您的每个函数,匿名类的语法可能有点繁重,您可以在单独的类中实现函数并使用它们。

现在您只需使用地图而不是开关:

myFunctionsMap.get(theValueSwitched).execute();

根据您初始化地图的方式、键的值以及您如何使用它,您可能需要检查myFunctionsMap.contains(theValueSwitched)(如果您有的话,这将是您的默认情况)。

编辑:Java 8 更短的语法是 myFunctionsMap.put(1,() -&gt; {/*do function1()*/});

【讨论】:

  • 太棒了,谢谢:)
【解决方案2】:

您可以将您的方法命名为 method1、method2、method3 等 .. 并使用反射来调用它们,使用您的变量。那样的话,你不会有很长的切换时间。

不过,我不知道这是否有效。

这是一个简洁的例子,来自维基百科的反思页面。

Object foo = Class.forName("complete.classpath.and.Foo").newInstance();
// Alternatively: Object foo = Foo.class.newInstance();
Method m = foo.getClass().getDeclaredMethod("hello", new Class<?>[0]);
m.invoke(foo); 

希望对你有帮助

【讨论】:

  • 谢谢,你说的我明白了。效率相当于我们编写反射代码的能力,然后我相信。让我检查一下
猜你喜欢
  • 1970-01-01
  • 2017-07-21
  • 2019-04-07
  • 2019-11-18
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多