我有一个套件,可以使用不同的参数运行一些操作。这些操作及其参数在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模式中以石头设置可能的值,然后针对它验证配置),然后使用第二个选项?还是有更好的东西?

    最佳答案

    我宁愿使用第二个选项。

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

    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
    }
    

    您还可以在另一个配置文件或属性中具有限定名称的列表,并在尝试创建类之前对照该列表进行检查。

    07-24 18:45
    查看更多