在开始构建应用程序时,我盯着使用只有五种情况的开关盒块来考虑。后来当构建进展时,更多的案例开始出现并开始产生问题。我知道我可能在第一时间错误地设计了它,但是如果这些事情发生了变化,我该如何有效地解决这个问题呢?下面给出一个例子
从此开始
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,那么有没有办法可以做到这一点?
请注意上面代码中给出的函数现在只是简单的数学函数。
答案 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);
希望有所帮助