枚举单例
来源:互联网 发布:sai绘图软件mac版 编辑:程序博客网 时间:2024/05/17 23:10
声明枚举实例的通常做法:
/*** Singleton pattern example using Java Enumj*/public enum EasySingleton{ INSTANCE;}
通过EasySingleton.INSTANCE来访问
DCL实现:
/*** Singleton pattern example with Double checked Locking*/public class DoubleCheckedLockingSingleton{ private volatile DoubleCheckedLockingSingleton INSTANCE; private DoubleCheckedLockingSingleton(){} public DoubleCheckedLockingSingleton getInstance(){ if(INSTANCE == null){ synchronized(DoubleCheckedLockingSingleton.class){ //double checking Singleton instance if(INSTANCE == null){ INSTANCE = new DoubleCheckedLockingSingleton(); } } } return INSTANCE; }}
上面的实现中getInstance()要被检查两次.确定其实例INSTANCE是否为null或已经实例化,
(这也就是为啥叫double checked locking模式)
可以使用DoubleCheckedLockingSingleton.getInstance()来获取实例
只是相比代码行数.枚举实现简单多了.
默认枚举实例的创建是线程安全的.(创建枚举类的单例在JVM层面也是能保证线程安全的),
所以不需要担心线程安全的问题
关于序列化.
以往的单例实现了序列化接口,那么就再也不能保持单例的状态了.因为readObject()方法一直返回一个
新的对象.使用radResolve()来避免此情况发生.
//readResolve to prevent another instance of Singleton private Object readResolve(){ return INSTANCE; }
枚举单例 对序列化有保证
第三点.采用反射来创建实例时.可通过AccessibleObject.setAccessible(),通过反射机制来调用私有
构造器.那么枚举可以防止这种创建第二个实例的情况发生.
注意:在android 中使用枚举通常会比使用静态常量要消耗2倍以上的内存,在android 开发当中,我们尽可能的不使用枚举,使用第二种麻烦的方法吧
http://segmentfault.com/q/1010000000646806
0 0
- 枚举实现单例
- Java 枚举单例
- 枚举单例模式
- 枚举单例
- Java枚举单例
- 枚举单例模式
- 单例模式实现:枚举单例
- 【设计模式 单例】枚举单例
- 使用单枚举类型实现单例
- 用枚举创建单例
- 单例与枚举类型
- 枚举单例的实现
- Java 枚举实现单例
- JAVA枚举单例模式
- 单例模式---枚举式
- 使用枚举实现单例
- 单例模式枚举写法
- java中的枚举单例
- 再谈网游同步技术:实时动作游戏同步方式和传输协议选择
- 关于设置元素居中的一些问题
- linux--sed
- IP地址判断有效性
- ssh登录很慢
- 枚举单例
- vim制作成IDE
- Java NIO原理和使用
- jQuery教程(19)-jquery ajax操作之序列化表单
- [易飞]包材Forcast四周滚动需求
- 常见的服务器
- Xcode因为证书问题经常报的那些错
- equals与==的区别
- JAVA-IO之File类