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());}}
}