如何在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 extends Fruit> clazz = (Class extends Fruit>) 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()); }
样本输出:
我是一个苹果我是香蕉我是草莓