为什么枚举实现的单例比较受推崇?有哪些好处?
 
  • 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等方法。

 

posted on 2018-09-09 18:45  文艺程序风  阅读(194)  评论(0)    收藏  举报