【问题标题】:Is there a way to save object references in an array list?有没有办法将对象引用保存在数组列表中?
【发布时间】:2019-07-07 10:10:07
【问题描述】:

我正在编写一个 Java 程序,它允许您通过控制台“混合”饮料。我有继承饮料类的类,例如,如果用户键入字符串“啤酒”,我想创建一个新的“啤酒”类。 如果用户键入字符串“wine”,则会出现一个新的“wine”类。 如何将“啤酒”字符串翻译成啤酒类。

我尝试创建一个 ArrayList,然后通过说将我拥有的每一类饮料添加到其中

al.add(new Beer()); 

问题是我只想在用户实际键入“啤酒”时创建一个新的啤酒实例。

【问题讨论】:

  • 您可以创建“Beer”类型的 ArrayList,并可以将 Beer 对象添加到 ArrayList 中。除了这个,你还面临什么其他问题?
  • 你想动态创建一个新的class Beer,还是你想用new()实例化一个新的Beer对象。这是两个非常不同的事情,因此请确保您的措辞准确!
  • 除此之外,我不确定您的要求。也许添加更多代码,包括给你一个错误的部分。
  • 我要实例化一个新的 Beer 对象

标签: java


【解决方案1】:

这里的答案是使用对Class#newInstance 方法的简单调用。将所有类保存在一个结构中并对其进行迭代以找到匹配项。

一个例子:

public class Classes {

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        List<Class<?>> classes = new ArrayList<>();
        classes.add(Beer.class);
        classes.add(Wine.class);
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();

        for (Class<?> clazz : classes) {
            if (clazz.getSimpleName().equals(input)) {
                Object obj = clazz.newInstance();
            }
        }
    }

    private static class Beer {
        public Beer() {
            System.out.println("A beer has been created.");
        }
    }

    private static class Wine {
        public Wine() {
            System.out.println("A wine has been created.");
        }
    }
}

输入/输出示例:

Wine
A wine has been created.

如果您有不同的构造函数并且每次都想选择不同的构造函数,请查看answer.

【讨论】:

  • Map&lt;String, Supplier&lt;Drink&gt;&gt; constructors = Map.of("Beer", Beer::new)
【解决方案2】:

您只需在 if 语句中检查用户输入:

if (userInput.equals("beer")) {
   a1.add(new Beer());
}

【讨论】:

  • 我知道,但我想喝很多酒,我认为硬编码不是一个好的解决方案。
  • @Slaw 是的,那是我的另一个想法。但即使我知道字符串“beer”与啤酒类的一个实例有关,我怎么能实例化另一个呢?
  • 为什么需要啤酒类的实例?
【解决方案3】:

我认为我正在寻找的答案在 java 中称为“反射”。 谢谢大家!

【讨论】:

  • 并非如此。反射很少是 Java 中任何事情的答案。很容易出错,而且你只在运行时才注意到。有些地方你需要反思,但同样:这是一个专家话题。只有在绝对必要时才使用它。一个小时前不知道反射的人不应该使用它。
猜你喜欢
  • 2012-04-18
  • 2020-03-20
  • 1970-01-01
  • 2023-02-15
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2021-01-12
相关资源
最近更新 更多