<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>
枚举引入于 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();
// ...
}
关键点:
1 传给需要 Weekday 的方法)。这是 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