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

时间:2018-04-26 08:58:54

标签: java object nested

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

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嵌套?

,我怎么能这样做呢?

1 个答案:

答案 0 :(得分:2)

如果您的所有水果都实现了一个通用界面,那就有点容易了。如果他们不这样做,那就太难了,我可能会建议完全使用另一种语言。 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());
    }
}

Banana与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());
}

示例输出:

  

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