我们说我有一个班级Foo
和另一个班级Bar
,它们都来自超级班级Foobar
,每个班级都有自己的构造函数。< / p>
所以,我想在Java 8中创建一个应用程序,让用户从要实现的对象列表中进行选择,并将它们添加到列表中 - 我正在考虑使用数组或散列表 - 在此case我想显示一条消息:
Choose an object of the following list:
[1] Foo
[2] Bar
这个想法是让用户创建这些类的多个实例并将它们添加到数组中。例如,如果用户选择1,我想分配一个变量a[0] = new Foo()
,然后如果他选择2,a[1] = new Bar()
,但是如果用户再次选择1,那么{{1} }应该是a[2]
的新实例。我的第一个想法是使用如下构造函数初始化数组:
Foo
该实施的问题在于,如果我拨打anArray[1] = new Foo();
anArray[2] = new Bar();
然后a[0] = anArray[1]
,则a[1] = anArray[1]
和a[0]
将是同一个对象。
我正在寻找的是,如果有一种方法可以创建每个对象的未定义数量的实例,而不必将其实现为a[1]
的链(因为实际上我有两种以上的对象)。我正在考虑使用数组或哈希表,但我不知道是否有实际的方法。
答案 0 :(得分:4)
假设他们实现了一个公共接口(或超类)Common
:
public interface Common {
}
public class Foo implements Common {
}
public class Bar implements Common {
}
然后,在Java 8中,我们可以定义一个Supplier
s:
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
进行一些不太理想的投射。
答案 1 :(得分:1)
我可以将对象构造函数存储到数组或哈希表中吗?
如果你在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();
答案 2 :(得分:0)
选择案例陈述最适合此。
这里的问题是这个,除非他们有一个已知的超类除了对象,它们不能放在一个数组中。所以我假设我会继续。
您可以使用java reflection API执行此操作。
在那里,您可以在运行时加载和创建实例。
对于数组,请创建Constructor[]
。研究反思,知道我的意思。
这可能会对你有所帮助。
答案 3 :(得分:0)
您正在寻找Factory pattern。在java 8中,你可以使用lambda表达式非常简洁地完成它。