我可以将对象构造函数存储到数组或哈希表中吗?

时间:2017-03-29 15:09:37

标签: java arrays class constructor hashtable

我们说我有一个班级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]的链(因为实际上我有两种以上的对象)。我正在考虑使用数组或哈希表,但我不知道是否有实际的方法。

4 个答案:

答案 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表达式非常简洁地完成它。