Java 根据对象的描述创建对象
我需要通过从文本文件中读取对象的描述来创建对象。 对象也在层次中,或者可以是装饰对象 比如说 对于文本文件中的此描述: Sample.txtJava 根据对象的描述创建对象,java,design-patterns,oop,input,Java,Design Patterns,Oop,Input,我需要通过从文本文件中读取对象的描述来创建对象。 对象也在层次中,或者可以是装饰对象 比如说 对于文本文件中的此描述: Sample.txt 文件读取器“fileName.txt” 缓冲文件输入读取器“FileName.txt” 缓冲StringInput读取器“TestString” 程序应阅读此说明并返回合适的读取器列表 newfilereader(“fileName.txt”) new BufferedReader(新文件阅读器(“FileName.txt”) newbufferedr
文件读取器“fileName.txt” 缓冲文件输入读取器“FileName.txt” 缓冲StringInput读取器“TestString”
程序应阅读此说明并返回合适的读取器列表
newfilereader(“fileName.txt”)
new BufferedReader(新文件阅读器(“FileName.txt”)
newbufferedreader(newstringreader(“TestString”))
有什么办法可以实现吗?
工厂模式可用于实现此IMHO 当然,你可以用工厂来做,但对我来说,这更像是一个工人的工作。(当然,您可以使用Factory界面,并将其作为构建器实现)
生成器更适合基于不同的输入创建复杂的对象层次结构,就像在您的案例中一样。我的第一个想法是使用
映射
并向后解析文件中的行:最后一个参数是文件名,然后每个单词(组)将映射到一个特定的类,您可以通过将前面的结果传递给它来实例化该类。如果您所有的实际情况都像问题中的示例那样简单,那么您可以使用您喜欢的方法(即,您以前已经使用过的内容)
但如果存在更复杂的情况,则应首先提供某种类型的解析器。即使对于示例中的最后一个字符串,生成必要的代码也不是那么简单:
public Object buildObject (Parser parser, Item param) {
if (!parser.hasNext ()) {
return param.getValue ();
}
Item nextItem = parser.getNextItem (); //1st call: "TestString", 2nd call: "StringReader"
if (nextItem.isParameter ()) { //1st call: true, 2nd call: false
return buildObject (parser, nextItem);
} else if (nextItem.isClassName () { //2nd call: true
Class c = Class.forName (nextItem.getStringValue ());
Constructor ctr = c.getConstructor (param.getClassName ()); //getClassName returns "String"
Object obj = ctr.newInstance (param.getValue ());
return buildObject (parser, new Item (obj));
} else {
throw new ParseException ("Illegal input");
}
}
这种代码的和平仍然是非常有缺陷的(没有try/catch,没有一些必要的逻辑),但它展示了基本思想(这个思想是关于它不是那么容易的任务)
也许值得寻找一些第三方LIB(即使您不得不牺牲您的文件格式并接受它们的格式)。您建议哪些第三方LIB可以提供这种灵活性