我已经检查了java.lang.Enum
的源代码和方法T valueOf(Class<T> enumType, String name)
从232行开始(java-8和java-11的实现似乎是相同的; {{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
键的情况?
答案 0 :(得分:7)
99.999 +%的调用将是有效的枚举名称。传递空名称始终是一个错误,并非您要优化的情况。因此,将空检查移三行意味着在枚举名称有效的常见情况下,将跳过检查。它不会改变结果;它不会改变结果。这只是一个很小的优化。