[英]Java instantiate generic hashmap value
我有以下java代码
public class QuestionBuilder {
private QuestionBuilder(){}
static HashMap<Long,Class<? extends Question>> questionIdMap;
static{
questionIdMap = new HashMap();
questionIdMap.put(1L, LicenseNumberQuestion.class);
questionIdMap.put(2L, USPQuestion.class);
}
static Question getQuestion(long questionId)
{
if(!questionIdMap.containsKey(questionId))
{
throw new BusinessProfileInputException("Add an id to question class map entry");
}
return questionIdMap.get(questionId).newInstance();
}
}
并且我希望我的getQuestion方法可以向我返回该类的新实例,该实例被指定为映射中的值,这是通过代码实现的。 然而,最后一行代码无法编译:
返回questionIdMap.get(questionId).newInstance();
我是不是在想这个错误? 即是否有更好的方法来解决这个问题?
您只需要捕获一个例外:
try {
return questionIdMap.get(questionId).newInstance();
} catch(InstantiationException e) {
System.out.println("Constructor failed: );
e.printStackTrace();
return null;
}
这样应该可以编译。
我会这样做:
public final class QuestionBuilder {
private QuestionBuilder(){}
public enum Type {
LICENSE_NUMBER {
@Override
Question getQuestion() { return new LicenseNumberQuestion(); }
},
USP {
@Override
Question getQuestion() { return new USPQuestion(); }
};
abstract Question getQuestion();
}
public static Question getQuestion(Type type) {
return type.getQuestion();
}
}
使用您的解决方案,该类的用户必须编写
Question question = QuestionBuilder.getQuestion(1);
这不是很好,因为不清楚此处的“ 1”是什么意思,并且她将必须学习大量数字的含义。 另外,如果您传递的数字不代表任何含义,那么就会出现问题(因此需要BusinessProfileInputException
)。
使用enum
方法,该类的用户将编写
Question question = QuestionBuilder.getQuestion(QuestionBuilder.Type.LICENSE_NUMBER);
现在显然更长了,但是有3个主要优点。 (1)该类的用户不需要记住任何抽象代码号。 实际上,如果用户使用的是体面的IDE,则在键入时实际上应该向她显示有意义的选择列表。 (2)不再需要BusinessProfileInputException
因为现在无法传递不表示任何内容的东西( null
除外,但在这种情况下,无论如何都会抛出NullPointerException
)。 (3)您不再需要反思来创建新的Question
,因此不需要烦人的try
块。
但这比这更好。 您会注意到,由于我们摆脱了Map
,因此QuestionBuilder
类实际上根本不做任何事情 。 您可以通过完全摆脱该类,并使enum
成为具有简单名称(如TypeOfQuestion
的顶级类,来进一步改善TypeOfQuestion
。 然后,所有用户必须输入的是
Question question = TypeOfQuestion.LICENSE_NUMBER.getQuestion();
Java中的enum
绝对出色。 它们远远优于其他语言的同类产品。 我强烈建议您了解它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.