3 回答
TA贡献1784条经验 获得超2个赞
我提出了一种不同的方法:
你可以让你的抽象类Questa 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];
唯一的缺点是您必须将所有实现放入单个类文件中,这可能会变得非常混乱,很容易
TA贡献1847条经验 获得超11个赞
对于问题的第一部分,以自动方式做这样的事情可能需要反思,但对于关于干净的第二部分,大多数人会发现它不是那么干净。
如果您同意将范围缩小到“扩展 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());
}
}
TA贡献1817条经验 获得超6个赞
我会使用工厂模式。
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不大于您的列表。
添加回答
举报
