Вы, вероятно, можете сделать это с помощью метода register, который вы показали, через Reflection API (это Class
штука).
Я недостаточно опытен с Java Reflection, чтобы написать более полезный ответ, но если вы ищете какой-то метод getConstructor
или что-то еще, вы, вероятно, получите его.
Чтобы вызвать этот метод, вы должны сделать что-то вроде (обратите внимание на синтаксис .class
):
QuestionFactory.registerType(QuestionType.TrueFalse, TrueFalseQuestion.class);
РЕДАКТИРОВАТЬ Ах, что угодно, у меня есть время для расследования. Попробуйте это:
public class QuestionFactory {
static final Map<QuestionType, Constructor<? extends Question>> map =
new HashMap<QuestionType, Class<? extends Question>>();
public static void registerType(QuestionType quesType, Class<? extends Question> ques) {
map.put(quesType, ques.getConstructor());
}
public static Question createQuestion(QuestionType quesType) {
return map.get(quesType).newInstance();
}
}
Я не скомпилировал это, но это должно сработать или, по крайней мере, направить вас в правильном направлении. Чтобы это работало, реализации Вопроса должны иметь конструктор без аргументов.
Поскольку вы используете статическую фабрику (иначе говоря, объектно-ориентированные глобальные переменные), вы можете задавать вопросы самостоятельно в их статическом инициализаторе .
public class TrueFalseQuestion implements Question {
static {
QuestionFactory.registerType(QuestionType.TrueFalse, TrueFalseQuestion.class);
}
// Whatever else goes here
}