单例模式实现最好的方式即枚举实现

单例类作为23种设计模式当中最常用的设计模式,实现方式有很多种,比较流行的是DCL(DoubleCheckLock)双重检查的实现,线程安全,又比较好,除了存在序列化的问题之外,还算不错,如果对DCL模式还不熟悉的可以看下我之前的博客,: 如何破坏双重校验锁的单例模式

最完美的实现方式其实是枚举,你用其他方式去实现单例,需要考虑很多问题,线程安全,序列化对单例模式的破坏。
关于What is an efficient way to implement a singleton pattern in Java?,stackOverflow有一条高赞的回答,如下图所示

在这里插入图片描述
EffectiveJava中明确表达过一个观点:
使用枚举实现单例的方法虽然还没有被广泛采用,但是单元素的枚举类型已经成为实现Signleton的最佳方法

其实在单例模式中,最不容易控制的问题是线程安全问题。
如果我们用代码实现单例,仅仅需要几行代码就可以解决

public enum Singleton {
   
   
	INSTANCE;
	public void 
}

接下来我们再看双重锁校验的代码

public class Singleton implements Serializable {
   
   
    private static volatile Singleton singleton;

    private Singleton() {
   
   
    }

    public static Singleton getSingleton() {
   
   
        if (singleton == null) {
   
   
            synchronized (Singleton.class) {
   
   
                if (singleton == null) {
   
   
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

	// 防止序列化
    private Object readResolve() {
   
   
        return singleton;
    }

}

通过对比我们发现代码比较臃肿,这是因为大部分代码都是在线程安全和锁粒度之间做权衡,另外还要解决反序列化破坏单例模式的问题,不知不觉代码就写得复杂了,反观枚举类型,简洁明了

其实并不是使用枚举就不需要保证线程安全,只不过线程安全的保证不再需要我们关心而已,也就是说,其实在底层还是做了线程安全方面的保证的。

定义枚举时使用的enum和class一样,也是Java中的一个关键字,就像class对应一个Class类一样,enum也对应一个Enum类
我们用javac 编译下文件,然后再用jad工具执行jad SingletonEnum.class会生成Singleton.jad文件,我们可以直接用文本编辑器查看

public final class S
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coffee_babe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值