gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:34 24 4
gpt4 key购买 nike

假设我有一个包含以下行的文本文件。

Add apple banana strawberry

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

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

我试过了;

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

但是没有用。我如何动态创建它,因为每行可以包含不同数量的水果。如果不对每个组合(例如 2 个嵌套或 3 个嵌套)使用 if 语句,我该如何做到这一点?

最佳答案

如果您的所有水果都实现一个通用接口(interface),这就容易多了。如果他们不这样做,那就要困难得多,以至于我可能建议完全使用另一种语言。 Java 不适合这种情况。

如果他们实现了一个通用接口(interface),你可以使用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());
}

示例输出:

I am an apple I am a banana I am a strawberry

关于java - 如何在java中读取文件时动态创建嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50038882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com