枚举单例

声明枚举实例的通常做法:

/**
* 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值