如何在java中读取文件时动态创建嵌套对象?

假设我有一个文本文件,其中包含以下行。

Add apple banana strawberry 

当我读取该行并用空格分割时。 我得到apple, banana, strawberry ,我想用我定义的类和使用装饰模式创建嵌套对象

 new apple(new banana(new strawberry())) 

我试过这个;

 new splited[1](new splited[2](new splited[3]()))) 

但它不起作用。 如何动态创建它,因为每行可以包含不同数量的水果。 如果不对每个组合使用if语句,如2嵌套或3嵌套,我怎么能这样做?

如果你的所有水果都实现了一个通用的界面,这有点容易。 如果他们不这样做,那就更难了,我可能会建议完全使用另一种语言。 Java不适合这种情况。

如果它们实现了一个公共接口,你可以使用Class.forName来获取类,然后getConstructor能够实例化对象:

基本接口(你的可能会声明更有用的行为):

 public interface Fruit { String getName(); } 

苹果:

 public class Apple implements Fruit { private final Fruit child; public Apple(final Fruit child) { this.child = child; } @Override public String getName() { return "I am an apple " + (child == null ? "" : child.getName()); } } 

香蕉可以与Apple完全相同,只是名称不同。

草莓:

 public class Strawberry implements Fruit { @Override public String getName() { return "I am a strawberry"; } } 

主要方法如下。 我们需要在数组中反向迭代,以便首先构建子对象。

 @SuppressWarnings("unchecked") public static void main(final String... args) throws Exception { String[] splitted = {"Apple", "Banana", "Strawberry"}; Fruit prevFruit = null; for (int i = splitted.length - 1; i >= 0; --i) { final String className = splitted[i]; final Class clazz = (Class) Class.forName("my.pckage." + className); if (prevFruit == null) // if first, use no-arg constructor { prevFruit = clazz.getConstructor().newInstance(); } else { prevFruit = clazz.getConstructor(Fruit.class).newInstance(prevFruit); } } System.out.println(prevFruit.getName()); } 

样本输出:

我是一个苹果我是香蕉我是草莓