簡體   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