如何实现可扩展的开关盒?

时间:2014-06-05 06:57:52

标签: java switch-statement conditional-statements

在开始构建应用程序时,我盯着使用只有五种情况的开关盒块来考虑。后来当构建进展时,更多的案例开始出现并开始产生问题。我知道我可能在第一时间错误地设计了它,但是如果这些事情发生了变化,我该如何有效地解决这个问题呢?下面给出一个例子

从此开始

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,那么有没有办法可以做到这一点?

请注意上面代码中给出的函数现在只是简单的数学函数。

2 个答案:

答案 0 :(得分:2)

考虑这样的界面:

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,() -> {/*do function1()*/});

答案 1 :(得分:1)

您可以将方法命名为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); 

希望有所帮助