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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值