假设我有一个类Foo
和另一个类Bar
,它们都从超类Foobar
扩展而来,每个类都有自己的构造函数。
所以,我想在Java 8中创建一个应用程序,让用户从要实现的对象列表中选择,并将它们添加到列表中 - 我正在考虑使用数组或哈希表 - 在这种情况下,我想显示如下消息:
Choose an object of the following list:
[1] Foo
[2] Bar
这个想法是让用户创建此类类的多个实例并将它们添加到数组中。例如,如果用户选择 1,我想用a[0] = new Foo()
赋值一个变量,然后如果他选择 2,a[1] = new Bar()
,但是,如果用户再次选择 1,那么a[2]
应该是Foo
的新实例。我的第一个想法是使用构造函数初始化一个数组,如下所示:
anArray[1] = new Foo();
anArray[2] = new Bar();
该实现的问题在于,如果我调用a[0] = anArray[1]
然后调用a[1] = anArray[1]
,那么a[0]
和a[1]
将是同一个对象。
我正在寻找的是是否有一种方法可以为每个对象创建未定义数量的实例,而不必将其实现为if else
链(因为实际上我有超过 2 种类型的对象)。我正在考虑使用数组或哈希表,但我不知道是否真的有办法做到这一点。
假设他们实现了一个公共接口(或超类)Common
:
public interface Common {
}
public class Foo implements Common {
}
public class Bar implements Common {
}
然后,在 Java 8 中,我们可以定义一个Supplier
数组:
List<Supplier<Common>> anArray = new ArrayList<>();
anArray.add(Foo::new);
anArray.add(Bar::new);
//or with lambdas:
anArray.add(() -> new Bar());
用法:
Common aNewCommon = anArray.get(0).get();
如果没有Common
接口(或超类),您将不得不从Object
进行一些不太理想的转换。
我可以将对象构造函数存储到数组或哈希表中吗?
如果你在Java-8+的土地上,那么你当然可以。 我假设你的意思HashMap
不是HashTable
. 相反,我会创建一个Factory
对象的数组。 创建一个FooFactory
和一个BarFactory
,每个都支持返回对象的 create 方法。
public interface MyFactory<T> {
public T create();
}
public class FooFactory implements MyFactory<Foo> {
public Foo create() {
return new Foo();
}
}
public class BarFactory implements MyFactory<Bar> {
public Bar create() {
return new Bar();
}
}
然后你可以做:
MyFactory[] factories = new MyFactory[10];
factories[0] = new FooFactory();
factories[1] = new BarFactory();
...
然后您可以使用数组:
Object obj = factories[0].create();
选择案例语句将最适合此。 这里的问题是,除非它们有一个已知的超类,除了对象,否则它们不能放在数组中。所以假设我会继续。 您可以使用 java 反射 API 执行此操作。 在那里,您可以在运行时加载和创建实例。 对于数组,请创建一个Constructor[]
。研究反思以了解我的意思。 这可能会对您有所帮助。
您正在寻找工厂模式。在java 8中,你可以使用lambda表达式非常简洁地做到这一点。