第3条:用私有构造器或者枚举类型强化Singleton属性
2016-06-22 09:37
274 查看
Singleton是指仅仅被实例化一次的类。通过被用来代表那些本质上唯一的系统组件,比如窗口管理器或者文件系统。
在http://www.cnblogs.com/13jhzeng/p/5256424.html中,提到了不同情境下Singleton多种实现方法。
使用单例类的方法来实现的Singleton在让其变成可序列化(Serializable)时,仅仅在声明上加上“implements Serializable”是不够的,为了维护并保证Singleton,必须声明所有实例域都是transient瞬时的,并提供一个readResolve方法,否则每次反序列化一个序列化实例时,都会创建一个新的实例。
从Java 1.5起,实现Singleton,只需编写一个包含单个元素的枚举类型:
这种方法实现起来更加简介,无偿地提供序列化机制(无需去实现Serializable),即使面对复杂的序列化或者反射攻击的时候,绝对防止多次实例化。
在http://www.cnblogs.com/13jhzeng/p/5256424.html中,提到了不同情境下Singleton多种实现方法。
使用单例类的方法来实现的Singleton在让其变成可序列化(Serializable)时,仅仅在声明上加上“implements Serializable”是不够的,为了维护并保证Singleton,必须声明所有实例域都是transient瞬时的,并提供一个readResolve方法,否则每次反序列化一个序列化实例时,都会创建一个新的实例。
private Object readResolve() { return INSTANCE; }
从Java 1.5起,实现Singleton,只需编写一个包含单个元素的枚举类型:
public enum Elvis { INSTANCE; private Elvis() { //枚举类型默认的构造器就是private的 System.out.println("Singleton"); }; }
这种方法实现起来更加简介,无偿地提供序列化机制(无需去实现Serializable),即使面对复杂的序列化或者反射攻击的时候,绝对防止多次实例化。
相关文章推荐
- JS产生随机数的几个用法详解
- ECSHOP中transport.js和jquery的冲突的简单解决办法
- 二分法查找有序数组
- java常用第三方软件包
- html标记语言的标准写法-参考自http://www.zhihu.com/question/20797118/answer/16212312
- 微信开发小结——积累与沉淀
- Jquery Validate 相关参数及常用的自定义验证规则
- 一个人
- 10033---WebSocket 实战
- Leetcode Zigzag Iterator
- Mybatis拦截器分页
- centos6.x完全禁用IPv6的方法
- java中对象的拷贝(克隆)
- 如何快速开发SPA应用
- DataSource是什么
- 笔记_PHP7新特性
- LeetCode 206: Reverse Linked List
- 解析字符串到hex格式
- 如何取消未知类型文件默认用记事本打开
- 套路组成员学期总结博客汇总