从java1.5版本以后,单例就有了一种新的写法。使用enum实现单例,更加简洁,直接就是可序列化的,还能够在复杂的序列化和反射攻击下确保只生成了一次。
enum的实现是在类内部建立enum
/**
* 使用枚举的单例模式
*
* @author sl
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class EnumSingleton{
private EnumSingleton(){} // 私有化构造类
public static EnumSingleton getInstance(){ // 获取实例
return Singleton.INSTANCE.getInstance(); // 调用enum中的实例方法
}
private static enum Singleton{ // static的enum
INSTANCE; // enum中的唯一成员
private EnumSingleton singleton;
//JVM会保证此方法绝对只调用一次
private Singleton(){
singleton = new EnumSingleton();
}
public EnumSingleton getInstance(){
return singleton;
}
}
}
用main函数测试一下
public static void main(String[] args) {
EnumSingleton obj1 = EnumSingleton.getInstance();
EnumSingleton obj2 = EnumSingleton.getInstance();
//输出结果:obj1==obj2?true
System.out.println("obj1==obj2?" + (obj1==obj2));
}