【问题标题】:Create different Java classes based on runtime config text根据运行时配置文本创建不同的 Java 类
【发布时间】: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


【解决方案1】:

我更喜欢使用第二个选项。

一个示例类。 (注意默认构造函数是必需的,因为它是由.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
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2013-12-11
    • 2016-07-13
    • 1970-01-01
    • 2014-02-05
    • 2020-05-16
    相关资源
    最近更新 更多