3 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
我提出了一種不同的方法:
你可以讓你的抽象類Questa enum,然后abstract在每個(gè)枚舉常量中實(shí)現(xiàn)方法(下面只是一個(gè)例子):
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
}
這樣你就可以隨機(jī)選擇一個(gè)枚舉常量(它是 的一個(gè)實(shí)例Quest):
Quest[] values = Quest.values();
int randomIndex = ThreadLocalRandom.current().nextInt(values.length);
Quest quest = values[randomIndex];
唯一的缺點(diǎn)是您必須將所有實(shí)現(xiàn)放入單個(gè)類文件中,這可能會(huì)變得非常混亂,很容易

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
對(duì)于問題的第一部分,以自動(dòng)方式做這樣的事情可能需要反思,但對(duì)于關(guān)于干凈的第二部分,大多數(shù)人會(huì)發(fā)現(xiàn)它不是那么干凈。
如果您同意將范圍縮小到“擴(kuò)展 Quest 的所有類”,一個(gè)可能的解決方案是在 Quest 的所有子類上使用一些靜態(tài)初始化方法,以將它們自己注冊(cè)為可能的 Quest,并使用通用方法為它們創(chuàng)建實(shí)例就像是
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貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
我會(huì)使用工廠模式。
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不大于您的列表。
添加回答
舉報(bào)