您的位置 首页 java

Java:枚举单例备受青睐的理由

什么是单例,常见的几种单例等,相信大家都是信手拈来,今天主要研究枚举单例,我第一看见枚举单例,是刚参加工作,看见别人用枚举实现的单例,当时就很好奇,第一眼其实是懵。。。。。

一、枚举单例

  public  Enum  Singleton{
            INSTANCE ; 
}  

对,你没有看错,就是这么短小干练,一行代码实现了一个单例类;

二、枚举类的优点

  • 线程安全 :枚举类线程安全,因为有个“幕后英雄”帮我们实现的,枚举在编译器编译后的字节码实质是一个 final 类,每个枚举类型是这个 final 类中的一个静态常量属性,其属性初始化是在该 final 类的 static 块中进行,而 static 的常量属性和代码块都是在类加载时初始化完成的,所以自然就是 JVM 保证了并发安全。
  • 反射免疫:其它单例都有一个缺陷,那就是通过反射就可创建一个新的对象,从而破坏单例对象唯一性(我们可以通过一些手段来规避,但是处理麻烦);反射在通过newInstance创建对象时,会检查该类是否为枚举类,如果是则抛出异常,反射失败,反射的关键源码
 ....
if ((clazz.getModifiers() & Modifier.ENUM) != 0)
             throw new IllegalArgumentException("Cannot reflectively create enum objects");
         ConstructorAccessor ca = constructorAccessor;   
....  
  • 规避 序列化 :除了枚举单例,常见单例一旦实现了 Serializable 接口后就不再是单例了,因为每次调用 readObject() 方法返回的都是一个新创建出来的对象; JVM 在枚举类型的序列化和反序列化上 做了特殊处理,序列化时仅仅是将枚举对象的name属性输出到结果中,反序列化时则是通过 Java .lang.Enum的valueOf方法来根据名字查找枚举对象,同时禁用writeObject、readObject、readObjectNoData、writeReplace、readResolve方法。

参考:《Effective Java》

文章来源:智云一二三科技

文章标题:Java:枚举单例备受青睐的理由

文章地址:https://www.zhihuclub.com/195663.shtml

关于作者: 智云科技

热门文章

网站地图