枚举
枚举(Enum)是 Java 中一种特殊的数据类型,用于定义固定数量的常量集合。相比传统的常量类(如 public static final int PENDING = 0),枚举提供了更好的类型安全和可读性。
为什么需要枚举
想象一个订单状态系统:
java
// ❌ 使用常量:类型不安全
int status = 1; // 这个 1 是什么意思?
if (status == 1) { } // 魔数,可读性差
// ✅ 使用枚举:类型安全,语义清晰
OrderStatus status = OrderStatus.PENDING;
if (status == OrderStatus.PENDING) { }枚举让代码自解释,每个状态都有明确的名字,不再需要注释来说明「1 代表什么」。
枚举的基本结构
java
public enum OrderStatus {
PENDING, // 待支付
PAID, // 已支付
SHIPPED, // 已发货
DELIVERED // 已送达
}编译后,枚举会变成一个继承 java.lang.Enum 的类,每个枚举值都是该类的静态实例。
快速导航
| 主题 | 内容 |
|---|---|
| 枚举的定义与基本使用 | 枚举的创建、带属性的枚举、常用方法 |
| 枚举的常用方法 | values()、valueOf()、ordinal()、compareTo() |
| 枚举实现接口 | 每个枚举值可以有不同行为 |
| 枚举单例模式 | 最安全、最简洁的单例实现 |
| 枚举与 switch | 配合 switch 的用法(JDK 14+ 箭头语法) |
枚举的独特优势
枚举之所以在 Java 中不可替代,因为它天然解决了这些问题:
1. 穷尽性保证
java
switch (status) {
case PENDING -> "待处理";
case PAID -> "已支付";
case SHIPPED -> "已发货";
case DELIVERED -> "已送达";
// 编译器检查:如果漏写一个 case,会报错
}2. 线程安全
枚举值在类加载时就创建好了,JVM 保证全局唯一且线程安全。这使得枚举成为实现单例的最佳选择。
3. 可序列化
枚举天然支持序列化,不需要额外的 readResolve() 方法。
枚举不是终点
枚举虽然强大,但也要避免滥用:
- 枚举值不应该是动态的(用户数、配置项不适合枚举)
- 枚举数量不宜过多(超过几十个就要考虑是否有更好的设计)
- 枚举不适合需要继承的场景
如果你在学习设计模式,会发现枚举是实现某些模式的优雅工具,比如 枚举单例。
