繁体   English   中英

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

[英]Can I store an object constructor into an array or hashtable?

假设我有一个Foo类和另一个Bar类,它们都从超类Foobar扩展而来,每个类都有其自己的构造函数。

因此,我想用Java 8创建一个应用程序,让用户从要实现的对象列表中进行选择,然后将它们添加到列表中(我正在考虑使用数组或哈希表),在这种情况下,我想显示一个消息像:

Choose an object of the following list:
 [1] Foo
 [2] Bar

这个想法是让用户创建此类的多个实例,并将它们添加到数组中。 例如,如果用户选择1,我想为变量分配a 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[0] = anArray[1] a[1] = anArray[1] ,则a[0]a[1]将是同一对象。

我正在寻找的是是否有一种方法可以创建每个对象的不确定数目的实例,而不必将其实现为if else链(因为实际上我有两种以上的对象类型)。 我当时在考虑使用数组或哈希表,但我不知道是否确实有这样做的方法。

假设它们实现了一个公共接口(或超类) 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对象数组。 创建一个FooFactoryBarFactory它们都支持返回对象的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 Reflection API来执行此操作。 在那里,您可以在运行时加载和创建实例。 对于数组,创建一个Constructor[] 学习反思以了解我的意思。 这可能对您有帮助。

您正在寻找Factory模式 在Java 8中,您可以使用lambda表达式非常简洁地完成此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM