为什么使用枚举创建单例?

为什么要用枚举类型实现单例模式?

资料学习:

为什么要用枚举实现单例模式-避免反射、序列化问题

(1)避免反射攻击

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;
}

当尝试利用反射创建枚举类型的实例时,源码判断,抛出异常(第11行)

(2)避免反序列化

//TODO

posted @ 2020-10-15 16:22  JerryMouseJDK  阅读(112)  评论(0)    收藏  举报