场景 1:状态 / 类型定义(最常用)
应用说明
用来统一管理业务中固定的状态、分类,替代硬编码魔法数字 / 字符串,避免零散常量,保证业务状态全项目统一。典型:订单状态、商品类型、审核状态。
示例:订单状态枚举
// 订单状态枚举publicenumOrderStatusEnum{PENDING_PAY(0,"待付款"),PAID(1,"已付款"),DELIVERED(2,"已发货"),FINISH(3,"已完成"),CANCEL(4,"已取消");privatefinalIntegercode;privatefinalStringdesc;// 构造器OrderStatusEnum(Integercode,Stringdesc){this.code=code;this.desc=desc;}// getterpublicIntegergetCode(){returncode;}publicStringgetDesc(){returndesc;}// 根据 code 反向查枚举(业务常用:数据库存数字,代码转枚举)publicstaticOrderStatusEnumgetByCode(Integercode){for(OrderStatusEnumstatus:values()){if(status.getCode().equals(code)){returnstatus;}}thrownewIllegalArgumentException("无效订单状态码");}}使用:数据库存储数字 0/1/2,代码通过枚举解析含义,杜绝手写数字出错。
场景 2:策略模式(消除臃肿 if/else 分支)
应用说明
多分支业务(支付类型、文件解析类型),传统写法多层 if-else if,维护困难;枚举绑定业务策略实现,根据类型直接执行对应逻辑,完全去掉分支判断。
示例:多种支付方式(微信 / 支付宝 / 银行卡)**
定义支付策略接口
publicinterfacePayStrategy{voidpay(LongorderId,BigDecimalmoney);}各个支付实现类
// 微信支付classWechatPayimplementsPayStrategy{@Overridepublicvoidpay(LongorderId,BigDecimalmoney){System.out.println("调用微信支付,订单:"+orderId+",金额 "+money);}}// 支付宝classAliPayimplementsPayStrategy{@Overridepublicvoidpay(LongorderId,BigDecimalmoney){System.out.println("调用支付宝支付,订单:"+orderId+",金额 "+money);}}支付类型枚举(绑定对应策略)
publicenumPayTypeEnum{WECHAT(1,"微信支付",newWechatPay()),ALIPAY(2,"支付宝支付",newAliPay());privatefinalIntegercode;privatefinalStringname;privatefinalPayStrategystrategy;PayTypeEnum(Integercode,Stringname,PayStrategystrategy){this.code=code;this.name=name;this.strategy=strategy;}// 直接调用支付逻辑,无任何 ifpublicvoiddoPay(LongorderId,BigDecimalmoney){this.strategy.pay(orderId,money);}// getter 省略}业务调用
// 传入支付类型编码,直接执行逻辑PayTypeEnum.getByCode(1).doPay(10001L,newBigDecimal("99.9"));新增支付方式只需要新增枚举项 + 实现类,开闭原则,不用修改原有 if 代码。场景 3:后端接口统一返回码(项目全局规范)
应用说明
后端 REST 接口统一响应编码,规范前后端交互:成功码、参数错误码、业务异常码、系统异常码,全项目统一错误文案,避免前后端码值不一致。
示例:全局响应码枚举
// 统一接口返回码publicenumResultCodeEnum{SUCCESS(200,"请求成功"),PARAM_ERROR(400,"请求参数非法"),UNAUTH(401,"未登录/权限不足"),BUSINESS_FAIL(501,"业务处理失败"),SYS_ERROR(500,"服务器内部异常");privatefinalIntegercode;privatefinalStringmsg;ResultCodeEnum(Integercode,Stringmsg){this.code=code;this.msg=msg;}// getter 省略}配套通用返回实体(接口统一返回格式)
publicclassResult<T>{privateIntegercode;privateStringmsg;privateTdata;// 快捷成功返回publicstatic<T>Result<T>success(Tdata){Result<T>res=newResult<>();res.setCode(ResultCodeEnum.SUCCESS.getCode());res.setMsg(ResultCodeEnum.SUCCESS.getMsg());res.setData(data);returnres;}// 快捷失败返回publicstatic<T>Result<T>fail(ResultCodeEnumcodeEnum){Result<T>res=newResult<>();res.setCode(codeEnum.getCode());res.setMsg(codeEnum.getMsg());returnres;}}Controller 使用示例:
@GetMapping("/test")publicResult<String>test(){// 业务异常直接返回固定错误码returnResult.fail(ResultCodeEnum.PARAM_ERROR);}| 使用场景 | 核心优势 |
|---|---|
| 状态定义 | 约束取值范围,代码可读性强,避免魔法值 |
| 策略替换 if | 代码易扩展,新增类型不用修改原有逻辑 |
| 统一返回码 | 前后端协议标准化,全局错误信息统一 |