使用枚举的方法来实现单例时很简单的一种方法,同时也可以防止反序列化攻击。
public enum SingletonTest4 {
INSTANCE;
public void doSomething() {
System.out.println("doSomething");
}
public static void main(String[] args) {
SingletonTest4.INSTANCE.doSomething();
}
}
Java规定,每一个枚举类型以及其定义的枚举变量在JVM中都是唯一的,因此在枚举类型的序列化和反序列化上,Java做了特殊的规定。
序列化的时候只将 INSTANCE这个名称输出,反序列化的时候再通过这个名称,查找对于的枚举类型,外部无法通过构造器创建枚举类的实例。因此反序列化后的实例也会和之前被序列化的对象实例相同,因此枚举本身就是单例的。
参考文章:
浅谈使用单元素的枚举类型实现单例模式