Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据对象的描述创建对象_Java_Design Patterns_Oop_Input - Fatal编程技术网

Java 根据对象的描述创建对象

Java 根据对象的描述创建对象,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

我需要通过从文本文件中读取对象的描述来创建对象。 对象也在层次中,或者可以是装饰对象 比如说

对于文本文件中的此描述:

Sample.txt


文件读取器“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可以提供这种灵活性