假设我有一个文本文件,其中包含以下行。
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嵌套?
,我怎么能这样做呢?答案 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());
}
示例输出:
我是一个苹果我是香蕉我是草莓