用 textfile/database[Java] 替换大型开关盒

Replace large switchcase by textfile/database[Java]

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

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

我更愿意在文本文件或数据库中执行此操作,我可以在其中访问此信息并像逗号分隔文件或 SQL 数据库一样简单地编辑它。 另外要说的是,这个 switch case 经常使用,因此速度有点重要。

我的问题是用什么样的方法可以代替这个

您也可以使用 reflections 来做到这一点:

让我们将您的函数命名为 function1、function2、...,它们对应于 ID 1、2、...等。假设它们不接受任何参数,并且 return无效。

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是class的对象,包含了function1,function2等这些方法

您可以用 Map<Integer, Runnable> actions 这样的结构替换您的开关。那么你可以 actions.get(id).run().

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

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

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

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

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