Java中enum用于声明固定、有限、命名明确的常量类型,提供类型安全、不可变性及内置方法;可定义字段、私有构造器和方法;支持values()遍历、valueOf()查找、switch匹配等特性。

Java 中的 enum 关键字用于声明枚举类型,它天然适合表示一组**固定、有限、命名明确**的常量值,比如星期、状态码、颜色、操作类型等。与用 public static final 字段模拟枚举相比,enum 提供类型安全、不可变性、内置方法和扩展能力。
基本语法:声明简单枚举
最基础的写法是直接列出所有枚举常量,每个常量默认是该枚举类型的唯一实例:
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
这里 Day 是一个类(编译后生成 Day.class),MONDAY 到 SUNDAY 是它的七个静态、final、不可变的实例。它们按声明顺序自动获得序号(ordinal()),从 0 开始;也可通过 name() 获取名称字符串。
为枚举添加属性和构造方法
枚举可以像普通类一样定义字段、私有构造器、方法——但构造器必须是 private(编译器强制):
立即学习“Java免费学习笔记(深入)”;
- 每个枚举常量在声明时可传入参数,调用私有构造器初始化其字段
- 字段通常设为 final,保证不可变
- 建议提供 getter 方法访问字段
例如,给每种状态附带中文描述和HTTP状态码:
public enum HttpStatus {
OK(200, "成功"),
NOT_FOUND(404, "未找到"),
INTERNAL_ERROR(500, "服务器内部错误");
private final int code;
private final String description;
// 私有构造器
HttpStatus(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() { return code; }
public String getDescription() { return description; }
}
常用内置方法与遍历枚举
所有枚举类都隐式继承自 java.lang.Enum,因此自带以下实用方法:
-
values():返回包含所有枚举常量的数组(按声明顺序),常用于遍历 -
valueOf(String name):根据名称字符串返回对应枚举实例(区分大小写,不存在则抛IllegalArgumentException) -
name()和toString():默认都返回常量名;可重写toString()返回更友好的描述 -
ordinal():返回声明顺序索引(慎用,易受重构影响)
示例遍历:
for (HttpStatus status : HttpStatus.values()) {
System.out.printf("%s -> %d (%s)%n",
status.name(), status.getCode(), status.getDescription());
}
在 switch 中安全使用枚举
Java 7+ 支持在 switch 表达式中直接使用枚举,编译器会检查是否覆盖全部常量(配合 default 可防遗漏):
public String getLevelMessage(HttpStatus status) {
return switch (status) {
case OK -> "请求成功";
case NOT_FOUND -> "资源不存在";
case INTERNAL_ERROR -> "服务异常";
default -> "未知状态";
};
}
这种写法比 if-else 更清晰,且 IDE 通常能提示未处理的分支,提升健壮性。


















