Java-获取扩展抽象类的所有类

时间:2019-02-12 09:25:03

标签: java abstract-class

好的,所以我开始使用Abstract类,但是我有一个问题:我有这个abstract class Quest。我的目标是在初始化new Quest对象时,给它一个随机的Quest类型(由扩展Quest的类表示)。现在我的代码是:

switch (r) {
    case 0:
        quest = new Bandit_Raids2();
        break;
    case 1:
        quest = new Bandit_Raids();
        break;
    case 2:
        quest = new Escort_Mission();
}

有什么方法可以自动执行此操作,或者只是更清洁?

3 个答案:

答案 0 :(得分:0)

我提出了另一种方法:

您可以将抽象类Quest设为enum,然后在每个枚举常量中实现abstract方法(以下仅是示例):

public enum Quest {
    ESCORT_MISSION {
        public void start(){/* escort something */}
    },
    BANDIT_RAIDS{
        public void start(){/* raid bandits */}
    },
    BANDIT_RAIDS2{
        public void start(){/* raid bandits, again */}
    };

    public abstract void start();

    // add here other methods and/or constructors and/or fields
}

这样,您便可以随机选择一个枚举常量(它是Quest的一个实例):

Quest[] values = Quest.values();
int randomIndex = ThreadLocalRandom.current().nextInt(values.length);
Quest quest = values[randomIndex];

唯一的缺点是您必须将所有实现都放在一个类文件中,这可能会很混乱,很容易

答案 1 :(得分:0)

对于问题的第一部分,以自动方式进行此类操作可能需要反思,但对于第二部分,大多数人会发现它不是那么干净。

如果您同意缩小“扩展Quest的所有类”的范围,可能的解决方案是在Quest的所有子类上都有一些静态初始化方法,以将其自身注册为可能的Quest并采用通用的创建方式他们的实例 像

public abstract class Quest {
    private static final List<Supplier<Quest>> suppliers = new ArrayList<>();

    protected static void register(Supplier<Quest> questSupplier) {
        suppliers.add(questSupplier);
    }

    public static Quest createQuest(){
        int r = 0; // replace by the random call you want there
        return suppliers.get(r).get();
    }
}




public class BanditQuest extends Quest{
    static {
        Quest.register(() -> new BanditQuest());
    }
}

答案 2 :(得分:-1)

我将使用工厂模式。

public abstract class Quest {
    // some generic code
}

public class BanditQuest extends Quest {
    // some specific code
}

public interface Factory {
    Quest create();
}

public class BanditFactory implements Factory {
    @Override
    public Quest create() {
        return new BanditQuest();
    }
}

List<Factory> factories = new ArrayList<Factory>();
factories.add(new BanditFactory());
// add all factories here

Quest quest = factories.get(r).create();

您需要确保 r 不会大于您的列表。