为什么最好的单例模式是枚举单例?

前言:

单例模式是最常见的设计模式了,无论在面试还是真正的工作时也会大量遇到单例模式,单例模式有懒汉饿汉,双重检查锁,静态内部类等等的实现方式,但在Effective Java一书中推荐使用枚举来实现单例模式,那为什么要使用枚举类来实现单例模式呢?

枚举单例模式代码:

public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}

为什么最好的单例模式是枚举单例:

1.书写简单,仅仅5行代码就能实现单例模式。

2.枚举类能防止破坏单例模式。

2.1.枚举类能防止利用反射方式获取枚举对象

原因:调用反射newInstance方法时会检查是否为枚举类,如果是将报错,错误如下:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflectively create enum objects

2.2.枚举类能防止使用序列化与反序列化获取新的枚举对象

原因:在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过java.lang.Enum的valueOf方法来根据名字查找枚举对象。同时,编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法。

你可能感兴趣的:(为什么最好的单例模式是枚举单例?)