枚举的方式实现单例设计模式:
《Effective Java》 这种方法在功能上与公有域方法相近,但是它更加简洁,无偿提供了 序列化机制,绝对防止多次实例化,即使是在面对复杂序列化或者反 射(静态内部类实现懒汉式单例设计模式的时候遇到反射时可能比较的无能为力一些)攻击的时候。虽然这种方法还没有广泛采用,但是单元素的枚举类 型已经成为实现 Singleton的最佳方法。—-《Effective Java 中文版 第二版》
所以比较牛逼的方式实现单例设计模式的第四种方式:(项目中如果能使用是最好的不过的)
import java.time.Instant;
public class Singleton {
//枚举实现单例设计模式的思想及步骤:
//同样是1.私有化构造器,2.一个获取实例的方法:getSingleton(),3.在这个类的中构造一个枚举类,这个枚举类,
// 这个枚举类中有一个字段,这个字段用来创建singleton对象;
//为什么这种方式对象一定会被创建出来?
//答:INSTANCE本质是一个静态常量,一旦枚举类被加载进内存中,INSTANCE就被创建,并且这个枚举类中存在一个字段,这个字段一旦被调用就
//创建一个Singleton对象,用于外部获取这个对象;
private Singleton(){
}
public Singleton Singleton(){
return SingletonHolder.INSTANCE.instance;
}
public enum SingletonHolder{
INSTANCE;//本质上它是一个静态常量,同时也是一个代表着SingletonHolder的一个对象;
private final Singleton instance;//每个枚举实例都有一个成员属性;这个成员属性一定会被创建,
SingletonHolder(){
instance = new Singleton();
}
}
}