繁体   English   中英

Java实例化通用哈希图值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM