当前位置: 首页 > news >正文

Java 枚举 Enum 三大实战场景:状态定义、策略模式、接口统一返回码

一、博客标题
Java 枚举 Enum 三大实战场景:状态定义、策略模式、接口统一返回码
二、实验目的
掌握 Java 枚举enum语法特性:常量定义、成员变量、成员方法、构造函数、枚举遍历。
吃透枚举三类核心落地场景:业务状态定义、优化 if-else 策略分支、后端接口统一返回码,理解枚举相比常量字符串 / 数字的类型安全优势。
对比传统常量写法,明确枚举编译期校验、可读性高、防止非法参数传入的优点,贴合企业后端开发规范。
三、实验环境
JDK 版本:JDK8 及以上(枚举自 JDK1.5 引入)
开发工具:IDEA / Eclipse
运行环境:Windows /macOS,Java 控制台测试
四、实验内容(分 3 个场景附完整代码)
场景 1:业务状态 / 类型定义(例 1:订单状态枚举)
需求
订单分为待付款、已付款、已发货、已完成、已取消 5 种状态,用枚举封装状态编码 + 中文描述,替代魔法数字0/1/2。
java
运行
// 订单状态枚举
public enum OrderStatusEnum {
WAIT_PAY(0, “待付款”),
PAID(1, “已付款”),
DELIVERED(2, “已发货”),
FINISHED(3, “已完成”),
CANCEL(4, “已取消”);

// 成员属性 private final Integer code; private final String desc; // 私有构造方法(枚举构造默认private,不能手动修改访问权限) OrderStatusEnum(Integer code, String desc) { this.code = code; this.desc = desc; } // getter public Integer getCode() { return code; } public String getDesc() { return desc; } // 根据code反向查询枚举 public static OrderStatusEnum getByCode(Integer code){ for(OrderStatusEnum status : values()){ if(status.getCode().equals(code)){ return status; } } throw new IllegalArgumentException("非法订单状态码:"+code); } // 测试入口 public static void main(String[] args) { // 根据编码获取状态 OrderStatusEnum status = OrderStatusEnum.getByCode(1); System.out.println("状态:"+status.getDesc()); }

}
优势:杜绝随意传入99这类无效状态码,编译期约束合法值。
场景 2:枚举实现策略模式,消除大量 if/else(例 2:计算器四则运算)
需求
加减乘除四则运算,不用if-else/switch判断运算符,枚举内置运算逻辑,实现策略分发。
java
运行
// 运算策略枚举
public enum CalculateEnum {
ADD(“+”){
@Override
public int calc(int a,int b) {return a+b;}
},
SUB(“-”){
@Override
public int calc(int a,int b) {return a-b;}
},
MUL(“"){
@Override
public int calc(int a,int b) {return a
b;}
},
DIV(”/"){
@Override
public int calc(int a,int b) {
if(b == 0) throw new ArithmeticException(“除数不能为0”);
return a/b;
}
};

private final String symbol; CalculateEnum(String symbol){this.symbol = symbol;} public String getSymbol(){return symbol;} // 抽象运算方法,每个枚举实例实现自己的策略 public abstract int calc(int num1,int num2); // 根据符号匹配枚举 public static CalculateEnum getBySymbol(String symbol){ for(CalculateEnum item : values()){ if(item.getSymbol().equals(symbol)){ return item; } } throw new RuntimeException("不支持的运算符"); } // 测试 public static void main(String[] args) { CalculateEnum calc = CalculateEnum.getBySymbol("+"); System.out.println(calc.calc(10,5)); // 15 CalculateEnum div = CalculateEnum.getBySymbol("/"); System.out.println(div.calc(10,2)); //5 }

}
优势:新增运算(取余 %)只需要新增枚举常量,不用修改原有 if 分支,符合开闭原则。
场景 3:后端接口统一返回码枚举(例 3:全局 Result 返回体)
需求
前后端交互统一返回码:成功 200、参数错误 400、未登录 401、服务器异常 500,枚举封装 code+msg。
java
运行
// 全局接口返回码枚举
public enum ResultCodeEnum {
SUCCESS(200,“请求成功”),
PARAM_ERROR(400,“请求参数非法”),
UNAUTHORIZED(401,“未授权,请登录”),
SERVER_ERROR(500,“服务器内部异常”);

private final Integer code; private final String msg; ResultCodeEnum(Integer code,String msg){ this.code = code; this.msg = msg; } // getter public Integer getCode() {return code;} public String getMsg() {return msg;}

}

// 统一返回实体(后端通用)
class Result{
private Integer code;
private String msg;
private T data;

// 快捷成功返回 public static <T> Result<T> success(T data){ Result<T> res = new Result<>(); res.setCode(ResultCodeEnum.SUCCESS.getCode()); res.setMsg(ResultCodeEnum.SUCCESS.getMsg()); res.setData(data); return res; } // 快捷失败返回 public static <T> Result<T> fail(ResultCodeEnum codeEnum){ Result<T> res = new Result<>(); res.setCode(codeEnum.getCode()); res.setMsg(codeEnum.getMsg()); return res; } // getter/setter省略 public void setCode(Integer code) {this.code = code;} public void setMsg(String msg) {this.msg = msg;} public void setData(T data) {this.data = data;} // 测试 public static void main(String[] args) { // 成功返回数据 Result<String> ok = Result.success("用户数据"); // 参数错误返回 Result<Object> err = Result.fail(ResultCodeEnum.PARAM_ERROR); System.out.println(ok); System.out.println(err); }

}
优势:全项目统一返回码规范,前后端对接不用反复核对文档,修改描述只改枚举一处。
五、实验心得体会
类型安全提升:对比public static final int ORDER_PAY =1常量定义,枚举是强类型,方法入参限定枚举类型,无法传入无关数字,从编译期避免参数错误。
代码可维护性优化:使用枚举内置策略替代冗长 if-else,新增业务类型只新增枚举项,不用改动原有逻辑代码,大幅减少分支嵌套。
企业开发落地认知:后端项目中枚举是标准化必备,状态码、业务类型、接口返回码几乎全用枚举管理,统一项目编码规范,方便团队协作。
细节踩坑总结:枚举构造器默认私有不能用 public 修饰;枚举不能被继承;可通过values()实现枚举遍历,是反向解析编码的核心方法。
六、实验总结
本次实验落地枚举三大经典使用场景,覆盖日常开发 80% 枚举使用场景,从状态存储、逻辑分支、接口规范三个维度验证枚举价值。
核心收获:枚举本质是特殊类,可自定义属性、构造、抽象方法,既拥有常量的固定性,又具备类的拓展能力。
拓展方向:枚举配合 Mybatis 实现数据库字段与枚举自动转换;结合注解实现枚举字典序列化,用于前端下拉框回显。

http://www.jsqmd.com/news/958509/

相关文章:

  • OpenCore Legacy Patcher:让旧款Mac重获新生的终极完整教程
  • 企业服务器数据备份与恢复完整方案(运维兜底核心)
  • JVM 内存模型深度解析:从原理到实战调优
  • 在Apple Silicon Mac上部署原生ARM64 Android模拟器的技术实现与性能分析
  • 从Modbus到Profibus:聊聊RS-485/422这些老伙计在主流工业协议里的那些事儿
  • 推荐靠谱的房屋装修公司 - myqiye
  • 3个专业技巧让你掌握MegSpot:跨平台视觉分析终极指南
  • 智能汽车AI工具整合不是选型问题,而是时间窗口问题:2024Q3起ECU算力认证新规倒逼重构的4大技术支点
  • Node.js 架构演进大师:从事件循环到现代服务端范式
  • 2026乐山门窗厂技术实测:宜宾哪家门窗厂好/宜宾哪家门窗厂性价比高/宜宾哪家门窗好看/宜宾哪里有门窗厂/宜宾定制门窗/选择指南 - 优质品牌商家
  • AI智能体开发从入门到落地全攻略核心框架选型常见坑点规避及实操干货分享
  • DTD 属性:定义文档类型与验证结构的重要元素
  • 【计算机毕业设计案例】基于springboot+微信小程序的博物馆文创系统的设计与实现(程序+文档+讲解+定制)
  • 3分钟搞定:用BetterJoy让Switch控制器在PC上完美运行
  • 别再傻傻分不清!一张图搞懂内存、硬盘、缓存(RAM/ROM/Cache)在电脑里到底怎么干活
  • 重新定义数字签名:vue-esign组件如何颠覆传统电子签名体验
  • Matlab粒子群算法自动优化Sugeno模糊控制器的隶属函数参数
  • 电脑多版本Python安装+切换全方案(分Windows / Mac/Linux,3种常用方法)
  • 电动伸缩门安装哪家好?红门机电,服务苏皖! - mypinpai
  • 大湾区哪家EMBA机构比较好?5大高含金量机构优选推荐 - 品牌测评鉴赏家
  • 2026年EB-5移民中介排名及服务能力分析 - 品牌排行榜
  • 2026年静安玄关整理收纳费用多少 - mypinpai
  • 南京Deepseek关键词优化服务商:AI搜索流量破局秘籍大公开
  • 2026年C语言就业环境好吗?现在哪个编程语言前景好?
  • Linux 解压命令速查表
  • CaptfEncoder V3:一个网络安全工程师的瑞士军刀是如何炼成的?
  • 如何用SPT-AKI Profile Editor成为《逃离塔科夫》离线版存档管理大师
  • 2026年近期青岛市(副省级城市)乳化沥青洒布设备优质厂家综合分析与推荐 - 2026年企业资讯
  • CVE-2026-45618深度剖析:从原型污染到沙箱逃逸,LiquidJS满分RCE漏洞全解(月下载730万+、在野利用、PoC公开)
  • NS-USBLoader:Switch游戏管理终极指南 - 一站式解决文件传输、RCM注入和大文件处理