用textfile/database[Java]替换大型switchcase
在我的项目中,我使用的函数需要读取ID以获取信息,比如下一步调用哪个函数,或者为每个ID获取唯一的名称。 到目前为止,我一直在一个switch case语句中编写所有这些信息,如下所示用textfile/database[Java]替换大型switchcase,java,switch-statement,readfile,Java,Switch Statement,Readfile,在我的项目中,我使用的函数需要读取ID以获取信息,比如下一步调用哪个函数,或者为每个ID获取唯一的名称。 到目前为止,我一直在一个switch case语句中编写所有这些信息,如下所示 switch(ID) { case 1: functionA() ...... case 400: functionZ() } 我更喜欢在文本文件或数据库中这样做,在那里我可以访问这些信息,并像逗号分隔的文件或SQL数据库一样对其进行编辑。 同样重要的是,这种开关箱经常使用,因此速度有点重要 我的问题是
switch(ID)
{
case 1: functionA()
......
case 400: functionZ()
}
我更喜欢在文本文件或数据库中这样做,在那里我可以访问这些信息,并像逗号分隔的文件或SQL数据库一样对其进行编辑。
同样重要的是,这种开关箱经常使用,因此速度有点重要
我的问题是,可以用什么样的方法来代替它。您也可以使用
反射来完成:
让我们将函数命名为function1、function2。。。它们对应于IDs1,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等的类的对象。您可以用类似于映射操作的构造替换开关。然后您可以只执行操作。获取(id)。运行()
棘手的部分是如何初始化此映射
键很简单,您可以按原样定义它们。值(那些Runnable
s)很棘手。您如何以可序列化的形式定义function
或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语句有多大区别。问题是?大型switchcase有哪些替代方案这看起来是函数的一个好方法,但对于读取名称,这将不起作用,因为每个名称都是唯一的。(编辑了答案中的名称)这看起来正是我需要的,我会在1小时内接受这个答案,让其他人有机会提出另一个建议。