Java 实战:精通枚举(Enum)的 3 大核心应用场景拒绝硬编码!Java 枚举类在项目中的三大硬核变现(附代码)
·
在 Java 开发中,enum(枚举)不仅仅是一个简单的“常量集合”。合理利用枚举,不仅能大幅提升代码的可读性和维护性,还能优雅地消除代码中的“魔法值”与繁琐的 if-else。本文将结合实际业务,深入解析枚举的 3 个经典应用场景。
💡 场景 1:状态 / 类型定义(最常用!)
这是枚举最基础、也是高频使用的场景。比如在电商系统、订单系统或者用户模块中,我们会定义各种状态(如:订单状态、支付状态)。
❌ 坏味道(使用常量或魔法值)
Java
public class OrderService {
// 1=待支付,2=已支付,3=已发货
public void handleOrder(int status) {
if (status == 1) {
System.out.println("处理待支付订单...");
}
}
}
缺点:代码可读性差,硬编码的数字散落各处,极易出错。
核心实现
Java
public enum OrderStatus {
PENDING_PAY(1, "待支付"),
PAID(2, "已支付"),
SHIPPED(3, "已发货"),
CANCELED(4, "已取消");
private final int code;
private final String description;
// 构造方法
OrderStatus(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() { return code; }
public String getDescription() { return description; }
// 根据 code 获取枚举对象(便于前后端交互)
public static OrderStatus getByCode(int code) {
for (OrderStatus status : values()) {
if (status.getCode() == code) {
return status;
}
}
return null;
}
}
⚡ 场景 2:策略模式(替换大量 if/else)
当不同的业务类型对应不同的计算或处理逻辑时,如果写一堆 if-else 或者 switch-case,代码会非常臃肿。我们可以直接在枚举中定义抽象方法,让每个枚举项实现自己的业务逻辑。
❌ 坏味道(传统 if-else 逻辑)
Java
if (userType.equals("VIP")) {
return price * 0.8;
} else if (userType.equals("SVIP")) {
return price * 0.7;
} else {
return price;
}
核心实现
Java
public enum DiscountStrategy {
NORMAL {
@Override
public double calculatePrice(double price) {
return price; // 原价
}
},
VIP {
@Override
public double calculatePrice(double price) {
return price * 0.8; // 8折
}
},
SVIP {
@Override
public double calculatePrice(double price) {
return price * 0.7; // 7折
}
};
// 定义抽象方法
public abstract double calculatePrice(double price);
}
使用示例
Java
double finalPrice = DiscountStrategy.VIP.calculatePrice(100.0); // 自动输出 80.0
🛠️ 场景 3:统一返回码(后端接口必备)
在前后端分离的开发模式中,后端返回给前端的数据通常需要统一格式。枚举常用于定义错误码(Result Code)和错误信息(Message)。
核心实现
Java
public enum ResultCode {
SUCCESS(200, "操作成功"),
PARAM_ERROR(400, "参数错误"),
UNAUTHORIZED(401, "暂未登录或Token过期"),
FORBIDDEN(403, "没有相关权限"),
NOT_FOUND(404, "资源不存在"),
INTERNAL_SERVER_ERROR(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; }
}
结合统一返回对象(Result)使用
Java
public class Result<T> {
private int code;
private String message;
private T data;
// 快捷成功返回
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.code = ResultCode.SUCCESS.getCode();
result.message = ResultCode.SUCCESS.getMessage();
result.data = data;
return result;
}
// 快捷失败返回
public static <T> Result<T> error(ResultCode resultCode) {
Result<T> result = new Result<>();
result.code = resultCode.getCode();
result.message = resultCode.getMessage();
return result;
}
// 省略 getter/setter
}
💡 总结
-
场景一 帮我们告别了魔法值,代码含义一目了然。
-
场景二 巧妙利用枚举的抽象方法,让高内聚的策略模式变得异常简单。
-
场景三 规范了前后端交互的边界,是规范化商业项目不可或缺的基础。
更多推荐
所有评论(0)