Java中定义枚举使用enum关键字,是特殊的类,用于表示固定常量集;支持字段、方法、构造器,继承自java.lang.Enum且不可被继承;提供values()、valueOf()等内置方法,广泛用于状态码、配置标识、单例及switch场景。

Java 中定义枚举类型使用 enum 关键字,它是一种特殊的类,用于表示一组固定、常量的值。相比用 public static final int 或 String 模拟常量,enum 更安全、可读性更强,还支持方法、字段和构造器。
基本语法:如何声明一个简单枚举
最简形式如下:
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
说明:
- 每个枚举常量(如 MONDAY)默认是该 enum 类型的静态实例;
- 枚举类隐式继承自 java.lang.Enum,不能被继承(即不能用 extends);
- 枚举常量必须放在枚举体最前面,后面可跟分号,再定义字段、方法等。
带属性和构造器的枚举(增强可读性与功能性)
枚举可以像普通类一样拥有私有字段、构造器(只能是 private)、getter 方法等:
立即学习“Java免费学习笔记(深入)”;
public enum HttpStatus {
OK(200, "Success"),
NOT_FOUND(404, "Resource not found"),
INTERNAL_ERROR(500, "Server error");
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; }
}
使用示例:
System.out.println(HttpStatus.OK.getCode()); // 输出:200 System.out.println(HttpStatus.NOT_FOUND.getMessage()); // 输出:Resource not found
枚举常用方法与遍历技巧
所有枚举类自动获得几个实用的静态/实例方法:
- values():返回包含全部枚举常量的数组(按声明顺序),常用于遍历;
- valueOf(String):根据名称字符串返回对应枚举实例(区分大小写,不存在则抛 IllegalArgumentException);
- name() 和 ordinal():分别获取枚举常量名和其在声明中的索引(从 0 开始);
- 可重写 toString() 提供更友好的显示文本。
遍历示例:
for (Day day : Day.values()) {
System.out.println(day + " at position " + day.ordinal());
}
枚举在实际开发中的典型用途
枚举不是“摆设”,而是解决特定问题的利器:
- 状态码管理:如订单状态(PENDING、SHIPPED、DELIVERED)、HTTP 状态(见上例);
- 配置开关或类型标识:如日志级别(DEBUG、INFO、WARN、ERROR)、消息类型(EMAIL、SMS、PUSH);
- 替代单例模式:枚举天然线程安全且防反射/反序列化攻击,适合轻量单例;
- 配合 switch 使用:JDK 7+ 支持在 switch 中直接使用 enum 常量,编译期检查更严格。
switch 示例:
switch (status) {
case PENDING:
processPending();
break;
case SHIPPED:
notifyCustomer();
break;
default:
throw new IllegalStateException("Unknown status: " + status);
}










