提起Java枚举(Enum),很多新手觉得它就是个"花架子"------无非定义几个固定值,远不如if-else顺手。但其实枚举藏着硬核实力,既能让代码更优雅,还能避免一堆坑。今天咱就扒一扒枚举的实用姿势,告别"枚举无用论"!
一、枚举不只是"常量容器"
先看个反例:用普通常量定义订单状态,一不小心就踩坑:
java
// 糟糕的写法:常量易被篡改、类型不安全
public class OrderStatus {
public static final int PENDING = 1;
public static final int PAID = 2;
public static final int SHIPPED = 3;
// 传个4进来?编译器根本拦不住!
public void processStatus(int status) {
if (status == PENDING) { /* 逻辑 */ }
}
}
换成枚举试试,直接把"非法值"堵在门外:
java
// 优雅写法:枚举天生类型安全、不可变
public enum OrderStatusEnum {
PENDING, PAID, SHIPPED; // 固定状态,不能新增/修改
}
// 只能传枚举实例,传错直接编译报错!
public void processStatus(OrderStatusEnum status) {
if (status == OrderStatusEnum.PENDING) { /* 逻辑 */ }
}
二、枚举里藏着"方法大招"
枚举可不是只能存值,还能自带方法,甚至实现接口!比如给状态加个描述:
java
public enum OrderStatusEnum {
PENDING("待支付", 1),
PAID("已支付", 2),
SHIPPED("已发货", 3);
// 枚举的成员变量
private final String desc;
private final int code;
// 枚举的构造方法(必须私有!)
private OrderStatusEnum(String desc, int code) {
this.desc = desc;
this.code = code;
}
// 自定义方法:获取描述
public String getDesc() {
return desc;
}
// 静态方法:根据code查枚举
public static OrderStatusEnum getByCode(int code) {
for (OrderStatusEnum status : values()) {
if (status.code == code) {
return status;
}
}
throw new IllegalArgumentException("无效状态码:" + code);
}
}
// 调用示例:直接拿描述,不用写一堆if-else
public static void main(String[] args) {
System.out.println(OrderStatusEnum.PAID.getDesc()); // 输出:已支付
System.out.println(OrderStatusEnum.getByCode(3)); // 输出:SHIPPED
}
三、switch里的"最佳搭档"
枚举和switch简直是天作之合,代码可读性直接拉满:
java
public void handleOrder(OrderStatusEnum status) {
switch (status) {
case PENDING:
System.out.println("请尽快支付");
break;
case PAID:
System.out.println("已安排发货");
break;
case SHIPPED:
System.out.println("请注意查收");
break;
// 不用写default!新增枚举时,编译器会提醒你补case
}
}
最后划重点
-
枚举是单例的集合,每个实例都是唯一的;
-
构造方法必须私有,不能手动new;
-
用枚举替代魔法值、常量组,代码更安全、易维护。
别再把枚举束之高阁了!下次定义固定值(比如状态、类型),直接掏出枚举,让代码少点bug,多点优雅~