在java中生成新随机对象的最有效方法是什么?

时间:2017-10-12 15:44:07

标签: java oop object random casting

我试图创建一个随机化方法,随机选择一个新的Monster对象添加到我的java游戏中。问题是有太多不同的Monster对象,我想避免在方法中创建多个唯一的if()语句。

我目前有一个抽象的怪物超类,有10个怪物子类。

我的第一个想法是创建一个字符串数组,然后将它们转换为对象,这些对象无效:

monsterInPlay=monsterRandomizer();

public Monster monsterRandomizer(){
    Random rand = new Random();
    String [] elements = {"bird","zombie","shark",etc...)
    String newMonster = elements[rand.nextInt(9)];
    return new ((Monster)newMonster());
}

我想这个想法的工作需要一个单独的方法。所以我目前只有10个单独的if()语句,我讨厌它的外观:

public Monster monsterRandomizer(){
    Random rand = new Random();
    int i = rand.nextInt(9);

    if (i==0){
        return new Shark();
    }
    if (i==1){
        return new Zomibie();
    }
    if (i==2){
        return new Bird();
    }

    // and so on....

我对java比较新,所以感谢任何帮助。我想避免在我的代码中放入10个不同的if()语句,如果可能的话。

3 个答案:

答案 0 :(得分:0)

这两种方法都是正确的,第一种方法更快但问题是你要用双括号返回一个“新”变量并将其加速到一个完全荒谬的怪物对象。关键字new始终在类名称之前使用,而不是像new Monster()这样的实例,这将为您提供Monster类型的“新”实例。

而是返回一个新的Monster Object并将该字符串传递给构造函数,然后在构造函数中处理String以自定义您的Monster。

代码中的方法

public Monster monsterRandomizer(){
    Random rand = new Random();
    String [] elements = {"bird","zombie","shark",etc...)
    String newMonster = elements[rand.nextInt(9)];
    return new Monster(newMonster);
}

Monster.java中的构造函数

public Monster(String preset){
    if (preset.equals("bird"){
        //height = ..
        //damage = ..
    } else if (preset.equals("zombie"){
        // ...
    } // else if ...
}

如果你想使用第二个使用else if因为它会让计算机的工作变得更容易,一旦条件得到验证,就不必每隔一个if检查一次。它在这里没有什么区别,但以后这是一个很好的做法。

答案 1 :(得分:0)

使用ifs的示例,如果调用Factory方法模式,那么它绝对有效。

您也可以使用以下内容:

public static void main(String[] args) {
    Random rand = new Random();
    int i = rand.nextInt(Monster.values().length);
    System.out.println(Monster.values()[i]);
}

enum Monster {
    SHARK,
    ZOMBIE,
    BIRD;
}

答案 2 :(得分:0)

这样的事情怎么样:

List<Supplier<Monster>> constructors = Arrays.asList(Shark::new, Zombie::new, Bird::new);
int randomIndex = new Random().nextInt(constructors.size());
return constructors.get(randomIndex).get();