【发布时间】:2017-04-29 00:16:57
【问题描述】:
我有一套可以使用不同参数运行一些操作的套件。操作及其参数在 XML 配置文件中提供。
每个操作都有一个单独的类来实现。所有这些类都扩展了一个抽象的 Operation 类,因此一旦创建了该类,就可以在代码中以相同的方式对其进行处理,无论实际操作是什么。
但是,我确实需要创建类。到目前为止,我看到了两种方法:
-
一个 switch 语句:
Operation operation; switch (operationName) { case "OperationA": operation = new OperationA(); break; case "OperationB": operation = new OperationB(); break; default: log.error("Invalid operation name: " + operationName); return true; } -
类名的运行时查找。我从未测试过这个选项,但它似乎是这样的:
Operation operation = (Operation)Class.forName(operationName).newinstance();
第一个选项似乎笨拙。第二个选项似乎过于信任配置,尽管我对此不确定。
也许我应该只验证 operationName 是包含我所有操作的预定义集合或列表的成员(或者在 XML 模式中设置可能的值并验证配置),然后使用第二个选项?还是有更好的?
【问题讨论】:
-
“也许我应该验证 operationName 是包含我所有操作的预定义集合或列表的成员” - 这几乎就是第二个示例要做的事情,因为如果无法加载类,它会抛出一系列异常,所以你最终在同一个地方,如果配置试图做错事怎么办。就个人而言,我会选择第二个选项,因为我很懒,它允许最大程度的扩展
-
这就是多态性的用途
-
我担心格式错误的配置文件会以不是操作类的有效类的名称放入。但是,转换为 Operation 应该会引发异常?
-
@kourouma_coder 我的问题是关于创建实例。我所拥有的只是一个带有操作名称的字符串。创建实例后,我不需要 instanceof - 所有处理都由类内的方法完成。
-
@kourouma_coder 但在工厂方法中,如果我只有一个带有操作名称的字符串,我该如何实际创建类?
标签: java class switch-statement