众所周知使用枚举类可以创建比较安全的单例, 因为枚举类不能通过反射来进行构造, 但是原因是什么呢?
首先我们来看看进行构造的方法
@CallerSensitive
public T newInstance(Object ... initargs)
throws InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException
{
if (!override) {
if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
Class<?> caller = Reflection.getCallerClass();
checkAccess(caller, clazz, null, modifiers);
}
}
if ((clazz.getModifiers() & Modifier.ENUM) != 0)
throw new IllegalArgumentException("Cannot reflectively create enum objects");
ConstructorAccessor ca = constructorAccessor; // read volatile
if (ca == null) {
ca = acquireConstructorAccessor();
}
@SuppressWarnings("unchecked")
T inst = (T) ca.newInstance(initargs);
return inst;
}
其中有一段代码
if ((clazz.getModifiers() & Modifier.ENUM) != 0)
这就是判断如果是枚举类型那么就只接抛出异常了, 也就不能进行构造了