2016-09-14 103 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) { 
    } 
相关问题