我有一个套件,可以运行一些具有不同参数的操作。操作及其参数以XML配置文件提供。
有一个单独的类实现每个操作。所有这些类都扩展了一个抽象的操作类,因此一旦创建了类,可以在代码中以相同的方式处理,无论实际操作是什么。
但是,我确实需要创建类。到目前为止,我看到了两种方法:
-
开关语句:
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架构中的stone中可能的值并验证配置对其进行验证(,然后使用第二个选项?还是有更好的东西?
我更喜欢使用第二个选项。
示例类。(请注意,需要默认构造函数,因为它是由.newinstance((调用的。您还可以参考此问题:我可以使用class.newinstance((带有构造函数参数?如果要创建新类并使用构造函数并使用一个构造函数使用参数。(
package com.mypackage;
public class SomeObject {
public SomeObject() {}
}
如何创建该类的实例:
try {
// you need to use the fully qualified name, not just the class name
SomeObject object = (SomeObject) Class.forName("com.mypackage.SomeObject").newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
// here you can handle incorrect config in your XML file
}
您还可以在另一个配置文件或属性中具有合格名称的列表,然后在尝试创建类之前对该列表进行检查。