用textfile / database替换大型switchcase [Java]

时间:2017-03-14 19:59:47

标签: java switch-statement readfile

在我的项目中,我正在使用需要读取ID的函数来获取下一个要调用的函数或为每个ID获取唯一名称的信息。 到目前为止,我一直在下面的switch case语句中写下所有这些信息。

switch(ID)
{
 case 1: functionA()
 ......
 case 400:  functionZ()
}

我更喜欢在文本文件或数据库中执行此操作,我可以访问此信息并将其编辑为简单的逗号分隔文件或SQL数据库。 同样重要的是,经常使用这种开关盒,因此速度有点重要。

我的问题是可以用什么样的方法来取代它。

2 个答案:

答案 0 :(得分:0)

您也可以使用reflections来执行此操作:

我们将您的功能命名为function1,function2,...它们对应于ID 1,2,...等等。我们也说它们不接受任何参数并返回void。

java.lang.reflect.Method method;
try {
  String methodName = "function" + ID;
  method = obj.getClass().getMethod(methodName);
  method.invoke(obj);
} catch (SecurityException e) { ... }
  catch (NoSuchMethodException e) { ... }

这里obj是包含这些方法function1,function2等的类的对象。

答案 1 :(得分:0)

您可以使用Map<Integer, Runnable> actions等建议替换您的开关。然后你可以actions.get(id).run()

棘手的部分是如何初始化此地图。

键是微不足道的,您可以按原样定义它们。值(那些Runnable s)很棘手。您如何以可序列化的形式定义functionAfunctionZ?可能有很多选择。例如,您可以将每个函数实现为单独的类,然后序列化类名。然后,您可以在CSV文件中配置switch语句,如:

id,className
1,com.acme.foo.FunctionA
400,com.acme.foo.FunctionZ

FunctionX实现Runnable(或任何其他合适的接口)。加载CSV文件时,您可以通过反射(Class.forName(className).newInstance)创建类的实例。你的开关就像actions.get(id).run()一样简单(好吧,一些空检查会很好)。

初始化后,这将非常快,你不应该看到与switch语句有太大区别。