关于枚举式单例的一些详解

来源:互联网 发布:修改图片的软件 编辑:程序博客网 时间:2024/06/05 04:39

之前写过一篇单例模式,没有说明为什么枚举可以反反射,反序列化!这里详细解释下,
首先枚举都是默认集成java中Enum类的,而在枚举类中禁用了readObject等一系列方法,我们知道,如果一个类继承Serizable接口,呢么就不可能是单例,因为每次调用readObject方法都会返回一个新的实例,所以,完全可以通过序列化来破坏单例,但是枚举类有其自己的一套序列化方式,禁用readObject方法,所以,不会因为序列化而破坏单例,再说为什么枚举是单例,因为当一个类为enum的时候,其会被编译为public static final T extends Enum,注意final,所以其首先是不能被继承的,其次,既然所有的enum都继承Enum类,呢么自然要看下Enum类,我们发现,只有一个构造,然而再看其注释的时候,给我们说,单独的构造方法,程序员无法调用此构造方法,为什么?往深处自己追追源码把,这回没开软件,懒得追!
我们再说下,为什么就可以反反射,我们知道,我们反射在创建实例的时候是调用的Class类下面的方法,呢么我们看下Class类,追其源码,我们会发现其把Class类和Enum类排除了,也就是只要是这两个类,会直接抛异常!如此,就反反射了,除非你自己写一套API,把java底层推翻了!