根据运行时配置文本创建不同的Java类

时间:2017-04-29 00:16:57

标签: java class switch-statement

我有一个可以使用不同参数运行一些操作的套件。操作及其参数在XML配置文件中提供。

有一个单独的类实现每个操作。所有这些类都扩展了一个抽象的Operation类,因此一旦创建了类,无论实际操作如何,都可以在代码中以相同的方式处理它。

但是,我确实需要创建类。到目前为止,我看到了两种方法:

  • 一个开关声明:

    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模式中设置可靠的值并验证配置),然后使用第二个选项?还是有更好的东西?

1 个答案:

答案 0 :(得分:2)

我更愿意使用第二种选择。

示例类。 (注意,默认构造函数是必需的,因为它是由.newInstance()调用的。如果你想创建一个新类并使用带参数的构造函数,你也可以参考这个问题:Can I use Class.newInstance() with constructor arguments?。)

os.Exit(0)

如何创建该类的实例:

package com.mypackage;

public class SomeObject {

    public SomeObject() {}
}

您还可以在另一个配置文件或属性中包含限定名称列表,并在尝试创建类之前检查该列表。