用 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()
.
棘手的部分是如何初始化这张地图。
密钥很简单,您可以按原样定义它们。值(那些 Runnable
s)很棘手。您将如何以可序列化形式定义 functionA
或 functionZ
?可能有很多选择。例如,您可以将每个函数实现为单独的 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 语句有太大区别。
在我的项目中,我使用的函数需要读取 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()
.
棘手的部分是如何初始化这张地图。
密钥很简单,您可以按原样定义它们。值(那些 Runnable
s)很棘手。您将如何以可序列化形式定义 functionA
或 functionZ
?可能有很多选择。例如,您可以将每个函数实现为单独的 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 语句有太大区别。