2016-09-14 88 views
2

我有一個由幾個派生的類擴展,這樣 猴狗貓魚的動物類等隨機實例派生的類

在我的計劃,我想隨機實例化三個派生類動物(沒關係它的推導 - 他們甚至可以允許重複);然後將它們插入列表中。我怎樣才能做到這一點?

List<Animal> animalList = new ArrayList<>(); 

for (int i=0;i<3;i++) { Animal animal = new Dog() or new Cat or new Dog()....; 

    animallist.add(animal); 
} 
+0

看看工廠模式。然後創建一個「AnimalFactory」,隨機選擇一種動物併爲您構建。 –

+0

你可以使用[this](/ a/15313028/2487517)這樣的東西來獲得你的所有繼承者 - 特別是使用Factory(@JustinNiessner建議)來實現這個 – Tibrogargan

回答

0

您可以使用math.random函數來生成一個介於1和無論你有多少類的隨機數。然後,讓每個號碼與某個班級相關聯。

0

你可以這樣做,使用「隨機」類:

int i = new Random().getNext(3); 

switch (month) { 
      case 0: animallist.add(new Dog()); 
        break; 
      case 1: animallist.add(new Cat()); 
        break; 
      case 2: animallist.add(new Cow()); 
        break; 
} 
+0

可憐的猴子! :(另外,窮人等! – Tibrogargan

0

只是爲了好玩(假設所有的動物都無參數的構造函數,噓我)

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.Random; 

class Animal { 
    private static HashSet house = new HashSet<Class>(); 
    private static Random random = new Random(); 

    public Animal() { 
     Animal.house.add(getClass()); 
    } 

    public static List party() throws InstantiationException, IllegalAccessException { 
     if (house.isEmpty()) { 
      return null; 
     } 

     ArrayList list = new ArrayList<Animal>(); 
     Class[] classes = (Class[])house.toArray(new Class[0]); 
     for(int i = 0; i < 3; i++) { 
      list.add(classes[random.nextInt(house.size())].newInstance()); 
     } 
     return list; 
    } 
} 
+0

一個比無參數構造函數更大的問題是構造函數必須在該方法工作之前調用。 – shmosel

+0

@shmosel真的。這實際上是一個棘手的問題。看起來瑣碎乍一看但實際上並非如此,因爲動物顯然是一個基類(可能是抽象的),它的意圖是有許多派生 - 可能有些派生對於基類是不可見的。完全做到這一點的唯一真正方法是使用像Reflections 。我決定妥協 – Tibrogargan

+0

你的解釋是一個棘手的問題如果我們不假設OP需要自動檢測和實例化子類,我們可以避免這兩個問題 – shmosel

-1

如果您如果你需要發現動態子類

List<Supplier<Animal>> constructors = Arrays.asList(Dog::new, Cat::new, Fish::new, Monkey::new); 
List<Animal> animalList = new Random() 
     .ints(3, 0, constructors.size()) 
     .mapToObj(constructors::get) 
     .map(Supplier::get) 
     .collect(Collectors.toList()); 
+0

差等!請不要忘記 – Tibrogargan

+0

@downvoter,請解釋。 – shmosel

+0

這個問題說有幾個派生類,並沒有給出完整的列表。你的解決方案只考慮一個子集,而且每次添加一個新的派生類時都需要進行修改。 (但方法參考捕獲/ lambda表達式使用的道具) – Tibrogargan

0

,:「再感覺流j,你可以試試這個

try { 
     Reflections reflections = new Reflections(Animal.class.getName().contains(".") 
       ? Animal.class.getName().substring(0, Animal.class.getName().indexOf(".")) : Animal.class.getName()); 
     Set<Class<? extends Animal>> subs = reflections.getSubTypesOf(Animal.class); 
     @SuppressWarnings("unchecked") 
     Class<? extends Animal>[] subTypes = subs.toArray(new Class[subs.size()]); 
     if (subTypes != null && subTypes.length > 0) { 
      List<Animal> list = new ArrayList<Animal>(); 
      Random random = new Random(); 
      for (int i = 0; i < 3; i++) { 
       list.add(subTypes[random.nextInt(subTypes.length)].newInstance()); 
      } 
     } 
    } catch (Exception e) { 
    }