枚举单例天然防反射攻击、反序列化不产生新对象、初始化绝对线程安全且写法极简:其构造器受JVM严格保护,反序列化强制返回唯一常量,类加载时由JVM同步初始化,仅需三行代码即可实现安全单例。

天然防反射攻击
普通单例(如懒汉式、双重检查锁)的私有构造器可被反射强行调用,从而创建多个实例。而枚举类的构造器由 JVM 严格控制,Java 规范禁止通过反射实例化枚举类型。即使调用 Constructor.setAccessible(true),运行时也会抛出 java.lang.IllegalArgumentException: Cannot reflectively create enum objects。这从语言机制层面堵死了最常见的一种单例破坏方式。
反序列化不产生新对象
普通单例若实现 Serializable,反序列化时默认会新建一个对象,破坏单例语义。开发者需额外添加 readResolve() 方法来拦截并返回原实例。而枚举类无需任何额外代码:JVM 序列化规范强制规定,反序列化枚举类型时,始终返回已加载的唯一枚举常量,不会触发构造器,也不会生成新实例。
初始化过程绝对线程安全
枚举实例在类加载阶段由 JVM 统一、一次性初始化,整个过程由类加载器内置同步机制保障。不需要 synchronized、volatile 或双重检查逻辑。多线程并发首次访问 MySingleton.INSTANCE 时,JVM 自动确保仅有一个线程执行初始化,其余线程阻塞等待——这个保证是 JVM 级别的,稳定且无误用风险。
写法极简,语义清晰
一个合法、安全、可直接使用的枚举单例只需三行:
public enum MySingleton { INSTANCE; }- 可立即通过
MySingleton.INSTANCE访问 - 如需扩展,可自然添加字段、方法甚至带参构造器(参数限编译期常量)
相比传统实现动辄十几行、易出错的同步逻辑,枚举单例把“唯一性”“线程安全”“序列化安全”全部交给 JVM 托管,开发者只专注业务逻辑。

















