-
1、枚举单例写法简单
public enum Singleton { INSTANCE; public void whateverMethod() { } }
-
2、枚举可解决线程安全问题
- (1)枚举中的各个枚举项通过static来定义的
- (2)static类型的属性会在类被加载之后被初始化
- (3)当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的(因为虚拟机在加载枚举的类的时候,会使用ClassLoader的loadClass方法,而这个方法使用同步代码块保证了线程安全)。所以,创建一个enum类型是线程安全的。
-
3、枚举可解决反序列化会破坏单例的问题
- (1)普通的Java类的反序列化过程中,会通过反射调用类的默认构造函数来初始化对象
- (2)在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过java.lang.Enum的valueOf方法来根据名字查找枚举对象。同时,编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法。
参考:Hollis枚举