最近因为工作需要需要实现单例模式,考虑到单例模式最简单的实现方式是枚举实现,因此研究了下枚举实现单例模式的原理,下面将从原理、详解两个步骤说明:
一:原理
1、单例模式利用了“
【 “
2、枚举类的构造器是private私有的,保障了内存中只有枚举的一个实例;
二:详解
1)、为什么说枚举实例是单例且线程安全的?
就拿枚举来说,其实Enum就是一个普通的类,它继承自`java.lang.Enum类。
public enum SingletonEnum{
SINGLETON;
}
对Singleton进行反编译可以得到如下java类:
public final class SingletonEnum extends Enum<SingletonEnum> {
public static final SingletonEnum SINGLETON;
public static SingletonEnum[] values();
public static SingletonEnum valueOf(String s);
static {};
}
由反编译后的代码可知,SINGLETON被声明为 static 的【 public static final SingletonEnum SINGLETON<==>public static final SingletonEnum SINGLETON = New SingletonEnum ();】,根据类加载过程可以知道虚拟机会保证一个类的
2)、如何保证枚举实例的单例?
首先
public enum SingletonEnum{
SINGLETON;
}
的实质是:
public enum SingletonEnum{
SINGLETON;
......
private SingletonEnum(){......}
}
因此外部无法通过构造器创建枚举类的实例,这也是枚举类通常用来保存常量的一个原因之一。
其次,枚举类的实例会在类加载的时候线程安全的进行初始实例化,在类加载的时候,JVM会对
综上所述,枚举保证了枚举实例的线程安全和单例性;
参考文章:
浅谈使用单元素的枚举类型实现单例模式
java回顾篇—static和非static的区别
一个简单java程序的运行全过程
static关键字的四种用法