我有以下抽象类
public abstract class Document {
private File file;
public Document(File f) {
this.file = f;
}
...
public abstract String parse();
}
目前,我有两个扩展 Document
的类:JsonDocument
和 XmlDocument
。
在另一个类 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/