Java枚举是可承载数据、逻辑和契约的完整类型,支持专属属性、私有构造器初始化、不可变字段、抽象方法实现差异化行为,以及配套工具方法如fromCode、toString等。

Java 枚举不是一串静态名字,而是可承载数据、逻辑和契约的完整类型。关键在于:每个枚举常量都能拥有专属属性,并通过私有构造器完成初始化——这正是实现“状态即对象”的基础。
属性声明与构造器绑定必须严格匹配
枚举常量后的小括号,本质是调用私有构造方法。参数顺序、类型、数量必须与构造器签名完全一致,否则编译失败。
- 字段必须用 private final 修饰,确保不可变性
- 构造器必须是 private(显式写或省略都默认如此)
- 所有字段应在常量列表之后、其他成员之前声明,否则语法报错
- 常量定义末尾必须以分号 ; 结束,不能遗漏
支持多类型组合属性,但需注意可变性风险
一个枚举项可同时携带 int、String、boolean、LocalDateTime,甚至自定义不可变类实例;若引入 List 或 Map 等可变容器,必须封装为不可修改视图。
- 推荐使用 Collections.unmodifiableList() 包装集合字段
- 避免在构造器中执行 IO、网络请求或耗时计算——类加载阶段即完成全部实例化
- 不建议在构造器中抛出检查异常(如 IOException),因无法被调用方捕获处理
为每个常量提供专属行为:抽象方法 + 实现体
当不同枚举项需要差异化逻辑(比如“支付成功”要发短信,“支付失败”要回滚库存),可在枚举类中定义抽象方法,再让每个常量在声明处直接实现。
- 抽象方法声明在常量列表之后、普通方法之前
- 每个常量必须用大括号 { ... } 显式重写该方法,否则编译报错
- 该方式天然支持多态,调用时无需 if-else 分支判断
配套工具方法必不可少:反查、校验、格式化
仅靠构造器和字段还不够。真实项目中总要根据 code 查枚举、按 name 校验输入、或统一输出描述文本。
- 写 public static Xxx fromCode(int code):遍历 values() 匹配,返回 Optional 更安全
- 重写 toString():返回 code + " " + message 等业务友好格式
- 避免重写 valueOf() 和 values():它们由编译器生成,手动定义会编译失败

















