《Effective Java》用私有构造器或者枚举类型强化SingleTon属性
2018-03-23 14:10
399 查看
我们耳熟能详的单例有懒汉式、饿汉式等
例如下面这段的饿汉式
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/20/ef933fe59f90683ec14c33f0a460db0f)
用private修饰构造方法,防止外界通过无参的构造方法直接创建对象,但是这样还是可以通过反射来攻击,造成代码的不安全,可以考虑设定一个变量,在创建第二个对象的时候抛出一个自定义的异常。
这样就安全了吗?
如果我将这个对象序列化到本地,然后再反序列化回来,这个对象还是原来的对象吗?不是的,这时可以考虑使用序列化的hock函数readResolve()来解决,当反序列化时,就会自动调用这个 readResolve方法来返回我们指定好的对象,如下图
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/20/b1b225b9cfa9f42deccec42280f5efdb)
还有一种非常简洁的方式,通过枚举实现单例
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/20/efa35a01ddb4e1c5d0de31a997850922)
Single就是要实现单例的类,通过SingeltonEnum.INSTANCE.getInstance()创建单例对象,枚举实际上是一种语法糖,反编译后会发现是由静态方法和匿名内部类组成。
总结:单例的实现有很多种,还有double-check,同步方法等方式实现,在这里不一一赘述,在effective java中作者强烈推荐枚举来实现高效安全的单例,不会被反射和序列化攻击所困扰。
例如下面这段的饿汉式
用private修饰构造方法,防止外界通过无参的构造方法直接创建对象,但是这样还是可以通过反射来攻击,造成代码的不安全,可以考虑设定一个变量,在创建第二个对象的时候抛出一个自定义的异常。
这样就安全了吗?
如果我将这个对象序列化到本地,然后再反序列化回来,这个对象还是原来的对象吗?不是的,这时可以考虑使用序列化的hock函数readResolve()来解决,当反序列化时,就会自动调用这个 readResolve方法来返回我们指定好的对象,如下图
还有一种非常简洁的方式,通过枚举实现单例
Single就是要实现单例的类,通过SingeltonEnum.INSTANCE.getInstance()创建单例对象,枚举实际上是一种语法糖,反编译后会发现是由静态方法和匿名内部类组成。
总结:单例的实现有很多种,还有double-check,同步方法等方式实现,在这里不一一赘述,在effective java中作者强烈推荐枚举来实现高效安全的单例,不会被反射和序列化攻击所困扰。
相关文章推荐
- Effective Java 2.3——用私有构造器或者枚举类型强化Singleton属性
- 《effective java》读书札记第三条用私有构造器或者枚举类型强化Singleton属性
- 用私有构造器或者枚举类型强化singleton属性——Effective Java 读书笔记
- 《Effective java》读书记录-第3条-用私有构造器或者枚举类型强化Singleton属性
- 《effective java》读书札记第三条用私有构造器或者枚举类型强化Singleton属性
- Effective Java 之 --- 用私有构造器或者枚举类型强化Singleton属性
- Effective Java 读书笔记(三):用私有构造器或者枚举类型强化Singleton属性
- Java学习笔记3:用私有构造器或者枚举类型强化Singleton属性
- Android 编码规范:(三)用私有构造器或者枚举类型强化Singleton属性
- (3):用私有构造器或者枚举类型强化Singleton属性
- 第3条:用私有构造器或者枚举类型强化Singleton属性
- Android 编码规范:(三)用私有构造器或者枚举类型强化Singleton属性
- EJ.03 用私有构造器或者枚举类型强化Singleton属性
- Effective Java (3) - 用私有构造器或者枚举类型强化Singleton属性
- Android 编码规范:(三)用私有构造器或者枚举类型强化Singleton属性
- Effective Java 创建和销毁对象 3.用私用构造器或者枚举类型强化Singleton属性
- 第3条:用私有构造器或者枚举类型强化Singleton属性
- 用私有构造器或者枚举类型强化Singleton属性
- 第3条:用私有构造器或者枚举类型强化Singleton属性
- 用私有构造器或者枚举类型强化 Singleton属性