为什么java.lang.Enum :: valueOf不首先检查空名称?

时间:2020-06-24 10:25:38

标签: java enums

我已经检查了java.lang.Enum的源代码和方法T valueOf(Class<T> enumType, String name)从232行开始(的实现似乎是相同的; {{3} }是Java 8的源代码。

public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) {
    T result = enumType.enumConstantDirectory().get(name);
    if (result != null)
        return result;
    if (name == null)
        throw new NullPointerException("Name is null");
    throw new IllegalArgumentException(
        "No enum constant " + enumType.getCanonicalName() + "." + name);
}

在使用name的{​​{1}}中找到按名称进行枚举后,Map进行空检查的原因是什么?据我所知,不能定义一个enumConstantDirectory()枚举。因此,以下调用没有任何意义:

null

尽管MyEnum myEnum = Enum.valueOf(MyEnum.class, null); // The NPE should be thrown 实现允许HashMap作为密钥,但我希望该实现在迭代null之前先检查null。这种实现的原因是什么?是否存在在比较Map之前搜索null键的情况?

1 个答案:

答案 0 :(得分:7)

该方法的

99.999 +%的调用将是有效的枚举名称。传递空名称始终是一个错误,并非您要优化的情况。因此,将空检查移三行意味着在枚举名称有效的常见情况下,将跳过检查。它不会改变结果;它不会改变结果。这只是一个很小的优化。