当前位置: 首页 > news >正文

单例模式 枚举

/*** 单例模式* 恶汉式 方式7*/
public enum SingletonEnum {INSTANCE;
}

这个写法虽然看起来最简单(只有一行代码),但它背后的原理其实非常深刻。它是《Effective Java》作者 Josh Bloch 官方推荐的单例模式最佳实现方式

1. INSTANCE; 到底是什么?

一句话答案:它就是一个静态、final 的对象实例。

枚举(Enum)在 Java 中并不是什么神奇的新物种,它在编译后,本质上就是一个普通的类(Class)

如果你把 SingletonEnum.java 编译再反编译,或者脑补它的“真实面目”,它大概长这样(伪代码):

// 代码:
public enum SingletonEnum {INSTANCE;
}// ------ 翻译给编译器看,大约等于 ------// 1. enum 其实就是一个继承了 Enum 类的 final 类
public final class SingletonEnum extends Enum<SingletonEnum> {// 2. INSTANCE 其实就是一个静态常量对象 (类似饿汉式)public static final SingletonEnum INSTANCE; // 3. 静态代码块初始化static {INSTANCE = new SingletonEnum("INSTANCE", 0);}// 4. 构造方法被强制私有化private SingletonEnum(String s, int i) {super(s, i);}
}

INSTANCE 就是 SingletonEnum 类的一个唯一的、静态的、全局对象。

可以像使用其他单例一样使用它:SingletonEnum.INSTANCE.doSomething();


2. 如何实现单例的?(为何只有一份?)

这完全依赖于 Java 语言规范对 enum 关键字的特殊保护:

  1. 构造方法自动私有化: 你无法在外部代码中写 new SingletonEnum(),编译器直接报错。
  2. 实例数量固定: 你在枚举里列出了几个名字(这里只有 INSTANCE 一个),JVM 就只承认这几个对象,除此之外无法生成新的。
  3. 防御最强技(防反射): 之前的几种单例(包括静态内部类),如果黑客非要用 反射 (Reflection)setAccessible(true) 强行调用私有构造器,是可以创建第二个实例的。
  • 但对于枚举,Java 的反射源码(Constructor.newInstance)里专门写了一行判断:if ((clazz.getModifiers() & Modifier.ENUM) != 0) throw new IllegalArgumentException("Cannot reflectively create enum objects");
  • 也就是说,连反射都杀不死它,它是真正绝对的单例。

3. 如何实现线程安全的?

这点和 饿汉式 以及 静态内部类 的原理完全一样。

  • 时机: INSTANCE 的创建是在类加载(Class Loading) 阶段进行的(看上面的伪代码,是在 static 块里 new 的)。
  • 保障: 我们之前说过,JVM 保证类的初始化阶段是绝对线程安全的(自带锁)。
  • 结论: 同样是利用了 JVM 的类加载机制 来保证并发安全。

总结

枚举单例其实就是披着“枚举外衣”的饿汉式单例,但它有两个饿汉式做不到的超强优势:

  1. 自带“防反射攻击”护盾(JDK 底层禁止反射创建枚举)。
  2. 自带“防序列化破坏”护盾(Java 序列化机制对枚举做了特殊处理,反序列化时不会创建新对象,而是直接返回原本的那个 INSTANCE)。

建议:
在实际生产中,如果你的单例对象不需要继承其他类(因为 Enum 已经继承了 Enum 类,Java 是单继承),且不介意饿汉式带来的那一点点启动负载,枚举单例是首选方案

http://www.jsqmd.com/news/314226/

相关文章:

  • 2025.12.13 总结 - # P2909 [USACO08OPEN] Cow Cars S
  • 手把手教你把恒小花分期商城额度提出来变现
  • Node.js 创建第一个应用
  • CSS 简介
  • 【软件研发核心工程实践】发布部署策略与性能测试关键技术详解
  • 民警检测数据集2105张VOC+YOLO格式
  • 【Java开发】办公通讯软件端到端消息分发与提示技术深度解析
  • Notes/Domino 2026 EA2来了!
  • ECharts 数据的视觉映射
  • 财务应收账款统计乱?IPA自动汇总客户欠款,催款有目标
  • 基于深度学习YOLOv12的设备泄漏检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 手动处理CSV转Excel?Python批量转格式,不用逐个开文件
  • 基于深度学习YOLOv11的红细胞、白细胞和血小板检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 基于深度学习YOLOv12的3D打印缺陷识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 基于深度学习YOLOv11的3D打印缺陷识别检测系统(YOLOv11+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 基于深度学习YOLOv12的条形码检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 基于深度学习YOLOv12的红细胞、白细胞和血小板检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 华润万家购物卡回收前必读清单
  • AngularJS 输入验证
  • 2025.12.14 作业 - # B4228 [常州市赛 2024] 盒子
  • 【开源鸿蒙跨平台开发--KuiklyUI--02】华为云真机部署实战指南
  • 数据不出域,AI能力随心用,JVS-AI以私有化部署保障数据安全,快速实现业务场景智能化
  • 【软件测试】8_性能测试实战 _执行测试脚本
  • 2025年,信息安全专业还值不值报考?(深度分析版)
  • 揭秘恒小花商城分期怎么使用
  • 详细介绍:机密计算与安全容器:openEuler安全生态深度测评
  • 快讯|Kimi K2.5模型开源详解:多智能体集群调度与视觉编程能力实现,赋能自动化工作流开发;全球首个“太空算力网”运行,阿里千问大模型成功在轨部署;全球首个跨本体视触觉数据集“白虎-VTouch”
  • DNS学习笔记
  • Lazy Stacking的设计说明
  • CSDN-Markdown新版说明 - 指南