java枚举是隐式继承java.lang.enum的特殊类,每个值为唯一实例;支持基础定义、属性构造、类型安全操作及enumset/map等用法,需注意valueof安全性、不可变性与接口实现限制。

Java 中定义和使用枚举类型非常直观,核心是用 enum 关键字替代 class,它不是简单常量集合,而是一个隐式继承 java.lang.Enum 的特殊类,每个枚举值都是该类的唯一实例。
基础定义:最简写法
直接列出所有取值,名称全大写,用逗号分隔:
public enum Week {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
- 编译后每个常量(如
Week.MONDAY)都是Week类型的对象,不是字符串或数字 - 无需
new,也不能new;构造器默认私有,JVM 确保单例性 - 自动拥有
values()(返回所有枚举值数组)、valueOf(String)(按名查实例)、ordinal()(声明顺序索引)等方法
带属性和构造器:增强表达力
当需要为每个枚举值附加数据时,可声明字段、私有构造器和 getter 方法:
public enum HttpStatus {
OK(200, "Success"),
NOT_FOUND(404, "Resource not found"),
SERVER_ERROR(500, "Internal 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; }
}
- 构造器必须私有,且只能在枚举常量列表后定义
- 字段建议用
final,保证不可变性 - 调用示例:
HttpStatus.OK.getCode()返回200
在代码中实际使用
枚举天然支持类型安全操作,常见用法包括:
- 变量声明:
Week today = Week.FRIDAY;—— 编译器禁止赋值非法值 - switch 判断(JDK 7+ 支持):
switch (status) { case ACTIVE: ... } - 遍历所有值:
for (HttpStatus s : HttpStatus.values()) { ... } - 反向查找:
HttpStatus.valueOf("OK")(注意大小写敏感,非法名抛IllegalArgumentException) - 与集合协作:
EnumSet.of(HttpStatus.OK, HttpStatus.NOT_FOUND)或EnumMap<week string></week>
注意事项与避坑点
看似简单,但几个关键细节容易出错:
-
valueOf()不处理空格或大小写错误,生产环境建议封装安全查找方法(如用Stream过滤) - 枚举序列化是安全的,反序列化会复用原有实例,不会破坏单例性
- 不要在枚举中持有可变状态(如非
final字段),否则可能引发线程安全问题 - 枚举不能继承其他类(已隐式继承
Enum),但可以实现接口,用于统一行为契约
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











