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

用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数据库一样对其进行编辑。 同样重要的是,这种开关箱经常使用,因此速度有点重要 我的问题是

在我的项目中,我使用的函数需要读取ID以获取信息,比如下一步调用哪个函数,或者为每个ID获取唯一的名称。 到目前为止,我一直在一个switch case语句中编写所有这些信息,如下所示

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小时内接受这个答案,让其他人有机会提出另一个建议。