Java-动态实例化抽象子类

标签 java

我有以下抽象类

public abstract class Document {
  private File file;
  public Document(File f) {
    this.file = f;
  }

  ...

  public abstract String parse();
}

目前,我有两个扩展 Document 的类:JsonDocumentXmlDocument

在另一个类 DocumentContent 中,我有一个函数可以迭代一些 json 和 xml 文件的集合,并调用 parse() 函数来提取某些内容。

如何在不使用条件语句的情况下根据检测到的文件扩展名动态实例化 Document 对象?将来还会添加其他文件扩展名,我希望避免每次创建新的 Document 类类型时都需要更新 DocumentContent。

最佳答案

你可以选择是否使用反射,没有反射你需要设计一个构建器,比如:

abstract class DocumentBuilder {
  public abstract Document build(File file);
}

HashMap<String, Builder> builders = new HashMap<String, Builder>();
builders.put("xml", new Builder(){ 
  public build(File file) { return new XMLDocument(file); } 
});

Builder correctBuilder = builders.get("xml");
if (correctBuilder != null)
  return correctBuilder.build()

对于反射,它会类似,但您将使用反射本身提供的 newInstance 工具:

HashMap<String, Class<? extends Document>> builders = new HashMap<String, Class<? extends Document>>();
builders.put("xml", XMLDocument.class);

try {
  Document document = builders.get("xml").newInstance();
}
catch (...)

关于Java-动态实例化抽象子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21594632/

相关文章:

java - 将鼠标事件从 JList 转发到列表中的项目

java - 访问循环中返回的对象

java - Java 中 System.out.printf 命令的问题

java - 这两种构造实例方式的区别(Reflect 和 new)

java - 在 Java 8 中从整数数组减少到 double

如果网络被修改,Java 应用程序将挂起

java - 使用jdbc(windows身份验证模式)从java连接到sql server

java - Maven 在集成测试阶段运行 jetty

java - Jaxb。自定义字段命名行为(camelCase 到 underscore_case)

java - 将 spring boot 应用程序作为依赖项添加到另一个 spring boot 应用程序