<aside> <img src="notion://custom_emoji/c233e7bc-acd0-812b-a811-00030dcd1edc/29e3e7bc-acd0-808e-ac64-007a3fac687d" alt="notion://custom_emoji/c233e7bc-acd0-812b-a811-00030dcd1edc/29e3e7bc-acd0-808e-ac64-007a3fac687d" width="40px" />

Java 中的枚举(enum)远不止是一个简单的“常量列表”。在 Java 中,枚举是一种特殊的类(Class),这使得它比 C/C++ 等语言中的枚举要强大得多。

对于枚举中的常量(即枚举类第一行定义的那些值),编译器默认且强制会加上 public static final 修饰符。

</aside>


1. 基础概念与定义

枚举引入于 Java 5,用于定义一组固定的常量

最简单的形式

public enum Weekday {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

实际上发生了什么?

当定义一个 enum 时,Java 编译器会在后台将其转换为继承自 java.lang.Enum 的类。

上面的代码大致等同于:

// 伪代码,模拟编译器行为
public final class Weekday extends java.lang.Enum<Weekday> {
    public static final Weekday MONDAY = new Weekday();
    public static final Weekday TUESDAY = new Weekday();
    // ...
}

关键点:


2. 进阶用法:给枚举添加属性和方法(最常用)

这是 Java 枚举最强大的地方。可以像普通类一样,给枚举添加成员变量、构造器和方法。这在开发“状态码”、“错误码”或“字典项”时非常有用。

示例:HTTP 状态码枚举

public enum HttpStatus {
    // 1. 定义枚举常量,必须在第一行
    // 括号内的值会传递给构造器
    OK(200, "Success"),
    BAD_REQUEST(400, "Bad Request"),
    NOT_FOUND(404, "Not Found"),
    INTERNAL_ERROR(500, "Internal Server Error");

    // 2. 定义成员变量(建议使用 final,因为枚举通常是不可变的)
    private final int code;
    private final String message;

    // 3. 定义构造器(必须是 private,JVM 会自动处理)
    HttpStatus(int code, String message) {
        this.code = code;
        this.message = message;
    }

    // 4. 定义 Getter 方法
    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    // 5. 自定义静态方法:根据 code 查找枚举
    public static HttpStatus fromCode(int code) {
        for (HttpStatus status : HttpStatus.values()) {
            if (status.code == code) {
                return status;
            }
        }
        throw new IllegalArgumentException("Unknown code: " + code);
    }
}

使用方式:

HttpStatus status = HttpStatus.OK;
System.out.println(status.getCode()); // 输出 200