枚举类型应用场景homework

张开发
2026/5/31 3:28:59 15 分钟阅读
枚举类型应用场景homework
1、状态/类型定义用数字或字符串来表示状态比如订单状态 1 表示待支付 2 表示已支付 3 表示已发货。java// 反例使用魔法数字public void updateOrderStatus(int status) {if (status 1) {// 待支付逻辑} else if (status 2) {// 已支付逻辑 }}这种“魔法数字”不仅可读性差而且容易传错值编译器也无法帮你检查。 枚举解决方案 用枚举定义状态语义清晰类型安全。/*** 订单状态枚举*/public enum OrderStatusEnum {// 定义所有可能的状态WAIT_PAY(1, 待支付),PAID(2, 已支付),SHIPPED(3, 已发货),COMPLETED(4, 已完成),CANCELLED(5, 已取消);private final int code;private final String desc;OrderStatusEnum(int code, String desc) {this.code code;this.desc desc;}// 根据code获取枚举public static OrderStatusEnum getByCode(int code) {for (OrderStatusEnum status : OrderStatusEnum.values()) {if (status.code code) {return status;}}throw new IllegalArgumentException(未知的订单状态码 code);}// getterpublic int getCode() {return code;}public String getDesc() {return desc;}}使用时public void updateOrderStatus(OrderStatusEnum status) {// 编译器会强制你传入合法的状态杜绝非法值switch (status) {case WAIT_PAY:// 待支付逻辑break;case PAID:// 已支付逻辑break;}}优势类型安全、可读性高、自带说明是定义固定状态/类型的最佳实践。2、策略模式替换大量 if/else业务中经常遇到根据不同类型执行不同逻辑的场景比如支付方式java// 反例大量的if/elsepublic void pay(String payType) {if (ALI_PAY.equals(payType)) {System.out.println(调用支付宝支付接口);} else if (WECHAT_PAY.equals(payType)) {System.out.println(调用微信支付接口);} else if (BANK_PAY.equals(payType)) {System.out.println(调用银行卡支付接口);} else {throw new IllegalArgumentException(不支持的支付方式);}}这种代码扩展性差每加一种支付方式都要修改这个方法违反了“开闭原则”。枚举 策略模式解决方案:将业务逻辑封装到枚举中让每个枚举实例自己实现策略。/*** 支付策略枚举*/public enum PayStrategyEnum {// 每个枚举实例对应一个支付策略ALI_PAY(ali_pay) {Overridepublic void pay() {System.out.println(【支付宝】调用支付宝SDK发起支付请求);}},WECHAT_PAY(wechat_pay) {Overridepublic void pay() {System.out.println(【微信支付】调用微信支付API统一下单);}},BANK_PAY(bank_pay) {Overridepublic void pay() {System.out.println(【银行卡】调用银联接口进行扣款);}};private final String type;// 抽象方法由每个枚举实例实现自己的逻辑public abstract void pay();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 void pay(String payType) {// 1. 获取对应的策略PayStrategyEnum strategy PayStrategyEnum.getByType(payType);// 2. 直接执行策略strategy.pay();}优势- 消除了大量 if/else 代码更清爽。- 新增支付方式时只需新增一个枚举实例无需修改原有代码符合开闭原则。3、统一返回码后端接口必备前后端交互时我们通常需要返回统一的状态码和信息比如- 200 成功- 400 参数错误- 500 服务器内部错误如果直接在代码里写数字同样会有“魔法数字”的问题。枚举解决方案用枚举定义所有接口返回码统一管理全局复用。java/*** 通用响应状态枚举*/public enum ResultCodeEnum {// 成功SUCCESS(200, 操作成功),// 客户端错误BAD_REQUEST(400, 请求参数错误),UNAUTHORIZED(401, 未授权请重新登录),FORBIDDEN(403, 拒绝访问),NOT_FOUND(404, 资源不存在),// 服务器错误INTERNAL_SERVER_ERROR(500, 服务器繁忙请稍后再试);private final int code;private final String message;ResultCodeEnum(int code, String message) {this.code code;this.message message;}// 封装统一响应方法public static Result success() {return new Result(SUCCESS.getCode(), SUCCESS.getMessage(), null);}public static Result success(Object data) {return new Result(SUCCESS.getCode(), SUCCESS.getMessage(), data);}public static Result fail(ResultCodeEnum codeEnum) {return new Result(codeEnum.getCode(), codeEnum.getMessage(), null);}// getterpublic int getCode() {return code;}public String getMessage() {return message;}}// 统一响应体类class Result {private int code;private String message;private Object data;public Result(int code, String message, Object data) {this.code code;this.message message;this.data data;}// getter/setter省略}在Controller中使用:RestControllerpublic class UserController {GetMapping(/info)public Result getUserInfo() {// 业务逻辑...if (/* 校验失败 */) {// 返回参数错误return ResultCodeEnum.fail(ResultCodeEnum.BAD_REQUEST);}// 返回成功和数据return ResultCodeEnum.success(new User());}}优势全局统一的返回码规范前后端对接效率更高错误信息清晰可维护。

更多文章