替代传统的 public static final 常量,将一组固定的状态/类型集中管理,自带类型校验,避免魔法值和非法值传入。
public enum OrderStatusEnum {
// 枚举实例:状态名称 + 状态码 + 描述
UNPAID(0, "未支付"),
PAID(1, "已支付"),
SHIPPED(2, "已发货"),
COMPLETED(3, "已完成"),
CANCELLED(4, "已取消");
private final Integer code;
private final String desc;
// 私有构造方法(枚举的构造方法默认私有)
OrderStatusEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
// 根据状态码获取枚举实例
public static OrderStatusEnum getByCode(Integer code) {
for (OrderStatusEnum status : OrderStatusEnum.values()) {
if (status.getCode().equals(code)) {
return status;
}
}
throw new IllegalArgumentException("无效的订单状态码:" + code);
}
// Getter
public Integer getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
OrderStatusEnum.PAID 比数字更直观。将不同分支的业务逻辑封装到枚举中,用枚举实例直接执行对应逻辑,彻底消除冗长的分支判断。
public enum PayStrategyEnum {
ALIPAY("alipay") {
@Override
public void pay(BigDecimal amount) {
System.out.println("调用支付宝支付接口,金额:" + amount);
}
},
WECHAT_PAY("wechat") {
@Override
public void pay(BigDecimal amount) {
System.out.println("调用微信支付接口,金额:" + amount);
}
},
UNION_PAY("union") {
@Override
public void pay(BigDecimal amount) {
System.out.println("调用银联支付接口,金额:" + amount);
}
};
private final String type;
// 定义抽象方法,由每个枚举实例实现
public abstract void pay(BigDecimal amount);
PayStrategyEnum(String type) {
this.type = type;
}
public static PayStrategyEnum getByType(String type) {
for (PayStrategyEnum strategy : PayStrategyEnum.values()) {
if (strategy.type.equals(type)) {
return strategy;
}
}
throw new IllegalArgumentException("不支持的支付方式:" + type);
}
public String getType() {
return type;
}
}
public class PayService {
public void doPay(String payType, BigDecimal amount) {
// 直接通过枚举获取对应策略并执行,无需if/else
PayStrategyEnum strategy = PayStrategyEnum.getByType(payType);
strategy.pay(amount);
}
}
定义后端接口的统一响应码和描述,规范前后端交互,避免不同接口返回码混乱,便于前端统一处理。
public enum ResultCodeEnum {
// 通用响应码
SUCCESS(200, "操作成功"),
FAIL(500, "服务器异常"),
PARAM_ERROR(400, "参数错误"),
UNAUTHORIZED(401, "未授权,请登录"),
FORBIDDEN(403, "权限不足,禁止访问"),
NOT_FOUND(404, "资源不存在"),
// 业务响应码
USER_NOT_EXIST(1001, "用户不存在"),
PASSWORD_ERROR(1002, "密码错误"),
ORDER_NOT_EXIST(2001, "订单不存在");
private final Integer code;
private final String message;
ResultCodeEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
public static String getMessageByCode(Integer code) {
for (ResultCodeEnum resultCode : ResultCodeEnum.values()) {
if (resultCode.getCode().equals(code)) {
return resultCode.getMessage();
}
}
return "未知错误";
}
// Getter
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
public class Result<T> {
private Integer code;
private String message;
private T data;
// 成功响应(带数据)
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.setCode(ResultCodeEnum.SUCCESS.getCode());
result.setMessage(ResultCodeEnum.SUCCESS.getMessage());
result.setData(data);
return result;
}
// 失败响应(自定义响应码)
public static <T> Result<T> fail(ResultCodeEnum resultCode) {
Result<T> result = new Result<>();
result.setCode(resultCode.getCode());
result.setMessage(resultCode.getMessage());
return result;
}
// Getter & Setter
public Integer getCode() { return code; }
public void setCode(Integer code) { this.code = code; }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
public T getData() { return data; }
public void setData(T data) { this.data = data; }
}
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/info/{id}")
public Result<User> getUserInfo(@PathVariable Integer id) {
User user = userService.getById(id);
if (user == null) {
return Result.fail(ResultCodeEnum.USER_NOT_EXIST);
}
return Result.success(user);
}
}
code=1001 即可快速定位问题。| 应用场景 | 核心优势 | 适用场景 |
|---|---|---|
| 状态/类型定义 | 类型安全、可读性强、集中维护 | 订单状态、用户角色、数据字典等固定状态 |
| 策略模式 | 消除分支、开闭原则、逻辑内聚 | 支付方式、消息推送、导出格式等多分支业务 |
| 统一返回码 | 规范交互、便于维护、可读性强 | 后端接口响应、错误码定义等跨端交互场景 |
private,不允许定义 public 构造方法。values() 方法可以获取所有枚举实例,常用于遍历和根据属性查找。