我已经检查了从第 232 行开始的源代码java.lang.Enum和方法T valueOf(Class<T> enumType, String name)(java-8和java-11 中的实现似乎相同;这里是 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);
}
Run Code Online (Sandbox Code Playgroud)
在get using 中按名称查找枚举后name发生空检查的原因是什么?据我所知,不能定义枚举;因此以下调用没有意义:MapenumConstantDirectory()null
MyEnum myEnum = Enum.valueOf(MyEnum.class, null); // The NPE should be thrown
Run Code Online (Sandbox Code Playgroud)
尽管HashMap实现允许null作为键,但我希望实现会null在迭代Map. 这种实现的原因是什么,是否存在null在比较之前搜索密钥name == null有意义的情况?
99.999+% 的对该方法的调用将是有效的枚举名称。传递空名称始终是一个错误,并不是您想要优化的情况。因此将空检查向下移动三行意味着在枚举名称有效的常见情况下将跳过检查。它不会改变结果;这只是一个小小的优化。