在我的项目中,我正在使用需要读取ID的函数来获取下一个要调用的函数或为每个ID获取唯一名称的信息。 到目前为止,我一直在下面的switch case语句中写下所有这些信息。
switch(ID)
{
case 1: functionA()
......
case 400: functionZ()
}
我更喜欢在文本文件或数据库中执行此操作,我可以访问此信息并将其编辑为简单的逗号分隔文件或SQL数据库。 同样重要的是,经常使用这种开关盒,因此速度有点重要。
我的问题是可以用什么样的方法来取代它。
答案 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)很棘手。您如何以可序列化的形式定义functionA
或functionZ
?可能有很多选择。例如,您可以将每个函数实现为单独的类,然后序列化类名。然后,您可以在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语句有太大区别。