一、why 枚举
Java 枚举(enum
)是 Java 5 引入的类型,是 java.lang.Enum
的子类,本质上是一个 特殊的类。每个枚举值本质上都是这个类的实例,并且在 JVM 中是唯一、线程安全的。
public enum OrderStatus {
PENDING, PAID, SHIPPED, COMPLETED
}
二、基本特点
特点 | 说明 |
---|---|
类型安全 | 别人无法传错值进来 |
有序 | 枚举值有 ordinal 序号 |
唯一实例 | 每个值 JVM 中唯一 |
可自定义字段和方法 | 可相当于 POJO |
自带方法 | name(),ordinal(),values() |
大量应用场景 | 状态码,资格,常量集合 |
三、使用场景
1. 接口上的状态码通信
public enum ResultCode {
SUCCESS(200, "操作成功"),
FAIL(500, "操作失败");
private final int code;
private final String message;
ResultCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() { return code; }
public String getMessage() { return message; }
}
2. 有限类型列表(社会性别,交通灯)
public enum Gender {
MALE, FEMALE, UNKNOWN
}
3. 配合 switch 分支
switch (status) {
case PENDING -> System.out.println("待付");
case PAID -> System.out.println("已支付");
}
4. 实现接口
public interface Operation {
int apply(int a, int b);
}
public enum Operator implements Operation {
ADD {
public int apply(int a, int b) { return a + b; }
},
SUB {
public int apply(int a, int b) { return a - b; }
}
}
5. 单例模式(最安全,推荐)
public enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("do work");
}
}
四、常用方法 API
方法 | 说明 |
name() | 返回枚举实例名称 |
ordinal() | 返回枚举实例的序号 |
values() | 返回所有枚举值的数组 |
valueOf(String) | 通过名称获取枚举实例 |
五、实际应用经验
-
状态码、角色类型、常量值必须用 enum 控制
-
全部值必须在初始化时构造,不要异步更改
-
如果需要操作 DB,建议 enum 中做二级映射
六、注意点
-
enum 不能 extends 其他 class(因为已 extends Enum)
-
enum 构造函数必须是 private
-
enum 值必须放在第一行,后面才能有字段/方法
-
不适合用于元素不确定或需动态扩展的场景
七、小结
Java 枚举是非常重要的类型技术,它是将数据 + 行为组合起来的形式,不仅是常量,而是有模型性、类型安全性的结构。
推荐:
-
尽量用 enum 控制值的范围
-
合理形成 "code + msg" 组合字段
-
配合 switch / stream / DB 操作
-
不要把 enum 当 "String 常量帐" 用,它可以更加智能