【effective java】3.用私有构造器或者枚举类型强化Singleton属性


1.why
单例实现1:final的静态成员变量
单例实现2:静态工厂方法

以上两种不能保证全局只有一个对象,因为可以通过反射或者序列化破坏它们
(1)通过反射构造出对象
```
Constructor<?> constructor = Elvis.class.getDeclaredConstructors()[0];
constructor.setAccessible(true);
Elvis instance = (Elvis) constructor.newInstance();
```
(2)如果上面两个单例实现了序列化,那么为了保证反序列化还是同一个对象,需要提供readResolve方法,否则,每次反序列化都会生成新的实例。具体解决方法可以查看 https://blog.csdn.net/charjay_lin/article/details/80872811 此文介绍了单例的7种实现方式,并且给出最优方法是内部类实现的单例


2.how
为了解决上述问题,可以使用枚举

通过枚举实现Singleton更加简洁,同时枚举类型无偿地提供了序列化机制,可以防止反序列化的时候多次实例化一个对象。枚举类型也可以防止反射攻击,当你试图通过反射去实例化一个枚举类型的时候会抛出IllegalArgumentException异常


猜你喜欢

转载自blog.csdn.net/CharJay_Lin/article/details/80948346
今日推荐