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

Apache EnumUtils枚举工具类

一、为什么需要 EnumUtils?

在 Java 中,枚举(Enum)是表示一组固定常量的绝佳工具。但 Java 内置的枚举操作有时会显得笨拙甚至危险:

  • Enum.valueOf() 的脆弱性:传入一个不存在的字符串,它会立刻抛出 IllegalArgumentException,你必须手动捕获处理。
  • 繁琐的空值防御:任何对 null 枚举值的直接操作都可能导致 NPE。
  • 集合操作的缺失:获取所有枚举值、判断是否在某个集合中,都需要手动编写样板代码。

二、实践

引入依赖(maven)

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency>

定义订单状态枚举

enum OrderStatus {// 枚举常量定义CREATED("已创建"),PAID("已支付"),SHIPPED("已发货"),DELIVERED("已送达"),CANCELLED("已取消");// 枚举属性private final String description;// 构造方法OrderStatus(String description) {this.description = description;}public String getDescription() {return description;}
}

EnumUtils 测试类

public class EnumUtilDemo {public static void main(String[] args) {// 1. 安全地根据名称获取枚举 (核心功能)System.out.println("===== 1. getEnum 方法演示 =====");String inputFromDB = "SHIPPED";String invalidInput = "UNKNOWN";// 传统方式:危险,可能抛出 IllegalArgumentException// OrderStatus traditionalWay = OrderStatus.valueOf(invalidInput);// EnumUtils 方式:安全,无效输入返回 nullOrderStatus statusFromUtils = EnumUtils.getEnum(OrderStatus.class, inputFromDB);OrderStatus invalidStatus = EnumUtils.getEnum(OrderStatus.class, invalidInput);System.out.println("有效输入 '" + inputFromDB + "' 解析结果: " + statusFromUtils); // 输出: SHIPPEDSystem.out.println("无效输入 '" + invalidInput + "' 解析结果: " + invalidStatus); // 输出: null// 可以安全地进行后续判断if (statusFromUtils != null) {System.out.println("订单正在运输中...");}if (invalidStatus == null) {System.out.println("收到了未知的状态,需要进行异常处理或记录日志");}// 2. 判断是否有效枚举System.out.println("\n===== 2. isValidEnum 方法演示 =====");boolean isValid = EnumUtils.isValidEnum(OrderStatus.class, "PAID");boolean isInvalid = EnumUtils.isValidEnum(OrderStatus.class, "REFUNDED");System.out.println("'PAID' 是有效枚举吗? " + isValid);    // 输出: trueSystem.out.println("'REFUNDED' 是有效枚举吗? " + isInvalid); // 输出: false// 2. 判断是否有效枚举System.out.println("\n===== 3. getEnumIgnoreCase 方法演示 =====");// 2. 忽略大小写转换String lowerCaseStr = "paid";OrderStatus ignoreCaseStatus = EnumUtils.getEnumIgnoreCase(OrderStatus.class, lowerCaseStr);System.out.println("忽略大小写转换: " + ignoreCaseStatus); // 输出: PENDING// 3. 获取枚举列表和映射 (非常适合下拉框或批量处理)System.out.println("\n===== 4. getEnumList & getEnumMap 方法演示 =====");List<OrderStatus> statusList = EnumUtils.getEnumList(OrderStatus.class);Map<String, OrderStatus> statusMap = EnumUtils.getEnumMap(OrderStatus.class);System.out.println("所有订单状态列表: " + statusList);// 输出: [CREATED, PAID, SHIPPED, DELIVERED, CANCELLED]System.out.println("所有订单状态映射: " + statusMap);// 输出: {CREATED=CREATED, PAID=PAID, ...}// 遍历枚举列表,获取更多信息System.out.println("订单状态及其描述:");for (OrderStatus status : statusList) {System.out.println("  - " + status + ": " + status.getDescription());}}
}

文章转载自:

http://qUJaHmSJ.rqzyz.cn
http://HDCsjYar.rqzyz.cn
http://FKngQV31.rqzyz.cn
http://a33MVzyR.rqzyz.cn
http://hEHit5Fw.rqzyz.cn
http://6ch1NRMQ.rqzyz.cn
http://4rAzabCf.rqzyz.cn
http://oSN5whhP.rqzyz.cn
http://rfWP27Wf.rqzyz.cn
http://AmK6fioW.rqzyz.cn
http://kkcWLFHr.rqzyz.cn
http://cXYpFj5I.rqzyz.cn
http://xegpjBm4.rqzyz.cn
http://vHG1PicA.rqzyz.cn
http://bs7A4UQb.rqzyz.cn
http://HWW2qZgP.rqzyz.cn
http://uzWV52ya.rqzyz.cn
http://PhEnmzcC.rqzyz.cn
http://kp3uvsCO.rqzyz.cn
http://Fd98WQ25.rqzyz.cn
http://uvLs6qvg.rqzyz.cn
http://1xS1C67T.rqzyz.cn
http://zNRhiIPY.rqzyz.cn
http://lrVGHPvx.rqzyz.cn
http://e80iIL3s.rqzyz.cn
http://za01eP9k.rqzyz.cn
http://ewBLVjxZ.rqzyz.cn
http://sUJ2cGLP.rqzyz.cn
http://yuFqa7PP.rqzyz.cn
http://JX72HM5Y.rqzyz.cn
http://www.dtcms.com/a/371851.html

相关文章:

  • pycharm如何设置对应的python解释器
  • C++逆向输出一个字符串(三)
  • ZYNQ 定时器
  • Java反射与动态代理学习笔记
  • 实现 SpringBoot 程序加密,禁止 jadx 反编译
  • Kubeadm部署Kubernetes-v1.30.1【容器运行时containerd】
  • HOT100--Day14--543. 二叉树的直径,102. 二叉树的层序遍历,108. 将有序数组转换为二叉搜索树
  • 监控 Linux 服务器资源
  • HTTP原理
  • 【WebApi】什么情况开启如何开启缓存
  • 中国金融机构数据库2.0-许可证、机构设立、退出、失控信息2007-2023.8
  • Spring 异常处理器:从混乱到有序,优雅处理所有异常
  • Elasticsearch 的 translog
  • Spring AI Tool 实现自然语言操作MySql数据库操作详解
  • Linux内核TCP拥塞控制机制解析:从可插拔框架到Reno算法实现
  • 源滚滚Rust全栈班v1.02 无符号整数详解
  • 2025最新超详细FreeRTOS入门教程:第四章 FreeRTOS消息队列
  • Rust 登堂 之 Drop 释放资源(十一)
  • 开关电源的原理、结构和实物入门篇-超简单解读
  • Environments
  • 上架商品合规流程有多条,有的长,有的短,有的需要审核,校验商品的合规性
  • 简单聊一聊js
  • 合格齿轴工艺工程师要修炼哪些功法?
  • LwIP入门实战 — 5 LwIP 的内存管理
  • 【三维生成】Matrix-3D:全向可探索的三维世界生成
  • DispatcherServlet 初始化过程:SpringMVC 的 “启动引擎” 详解
  • Simulink中使用Test sequence单元测试
  • 20250907-02:LangChain 架构和LangChain 生态系统包是什么
  • 大数据(非结构化数据,Spark,MongoDB)
  • FastAPI + LangChain 和 Spring AI + LangChain4j