Skip to content

枚举

枚举(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() 方法。

枚举不是终点

枚举虽然强大,但也要避免滥用:

  • 枚举值不应该是动态的(用户数、配置项不适合枚举)
  • 枚举数量不宜过多(超过几十个就要考虑是否有更好的设计)
  • 枚举不适合需要继承的场景

如果你在学习设计模式,会发现枚举是实现某些模式的优雅工具,比如 枚举单例

基于 VitePress 构建