Java中enum创建的枚举类本质是继承java.lang.Enum的特殊类,确保实例唯一、不可变、类型安全;支持声明常量、添加私有字段与构造方法、定义方法及重写、实现接口,并需注意避免可变状态和错误比较方式。

Java 中用 enum 关键字创建枚举类,本质是定义一个特殊的类,它自动继承 java.lang.Enum,编译器会确保实例唯一、不可变、类型安全。
基础语法:声明枚举常量
最简单的写法是直接列出枚举值,每个值都是该枚举类型的静态常量,且隐式为 public static final:
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
这样声明后,Day.MONDAY 就是一个类型为 Day 的对象,编译期就能检查类型,不会出现字符串拼写错误或非法值。
添加构造方法和字段:让枚举携带数据
枚举可以像普通类一样定义私有字段、构造方法(必须是 private)和 getter 方法,用于绑定额外信息:
立即学习“Java免费学习笔记(深入)”;
- 构造方法只能是
private,防止外部创建新实例 - 每个枚举常量在声明时调用构造方法传参
- 常用场景:关联中文名、状态码、描述等
enum HttpStatus {
OK(200, "成功"),
NOT_FOUND(404, "未找到"),
INTERNAL_ERROR(500, "服务器内部错误");
private final int code;
private final String message;
HttpStatus(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() { return code; }
public String getMessage() { return message; }
}
定义方法和重写:增强枚举行为
枚举类可包含普通方法、静态方法,也能重写父类方法(如 toString()),甚至实现接口:
- 重写
toString()可自定义打印内容,不影响name()返回原始名称 - 静态方法适合做查找工具,比如根据 code 查找枚举实例
- 实现接口可统一行为,例如所有状态都支持日志格式化
enum Level {
DEBUG, INFO, WARN, ERROR;
@Override
public String toString() {
return name().toLowerCase();
}
public static Level fromString(String s) {
return Arrays.stream(Level.values())
.filter(l -> l.name().equalsIgnoreCase(s))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("Unknown level: " + s));
}
}
使用注意事项:保证类型安全的关键点
枚举的类型安全性来自语言机制,但需注意几处常见误用:
- 不要用
==比较枚举和null,应优先用Objects.equals(a, b)或直接判空 - 避免在枚举中保存可变状态(如
ArrayList字段),破坏不可变性 - 序列化/反序列化默认安全,但若自定义了
readObject,需确保不破坏单例语义 - switch 表达式中使用枚举,编译器能检查是否覆盖全部分支(配合
default或密封枚举更严谨)


















