2025-07-24
JAVA
0

目录

Java枚举工具类:优雅处理枚举与索引转换
引言
枚举工具类概述
核心方法详解
1. 根据原生有序索引获取枚举名称
2. 根据自定义index获取枚举名称
3. 根据自定义index获取枚举描述
使用规范
实际应用示例
场景1:数据库值转换
场景2:枚举描述获取
完整代码实现
1. 枚举工具类 EnumsUtil.java
2. 枚举类示例 MsgTypeEnum.java
设计优势
注意事项
总结

Java枚举工具类:优雅处理枚举与索引转换

引言

在Java开发中,枚举(Enum)是一种非常实用的数据类型,它能够帮助我们更好地组织和管理一组相关的常量。然而,在实际业务场景中,我们经常需要在枚举的索引(index)、名称(name)和描述(description)之间进行转换。本文将介绍一个强大的枚举工具类EnumsUtil,它能帮助我们优雅地处理这些转换操作。

枚举工具类概述

EnumsUtil是一个基于Hutool工具集的枚举工具类,它提供了以下几种核心功能:

  1. 根据原生有序索引获取枚举名称
  2. 根据自定义index属性获取枚举名称
  3. 根据自定义index属性获取枚举描述

核心方法详解

1. 根据原生有序索引获取枚举名称

java
public static <T extends Enum<T>> String getNameByOriginIndex(Class<T> enumClass, Integer originIndex)

参数说明

  • enumClass: 枚举类类型
  • originIndex: 枚举的原生有序索引(从0开始)

使用示例

java
String name = EnumsUtil.getNameByOriginIndex(MsgTypeEnum.class, 0); // 返回 "PROJECT_AUDIT"

2. 根据自定义index获取枚举名称

java
public static <T extends Enum<T>> String getNameByIndex(Class<T> enumClass, Integer index)

参数说明

  • enumClass: 枚举类类型
  • index: 枚举中自定义的index属性值

使用示例

java
String name = EnumsUtil.getNameByIndex(MsgTypeEnum.class, 3); // 返回 "代理审核"

3. 根据自定义index获取枚举描述

java
public static <T extends Enum<T>> String getDescriptionByIndex(Class<T> enumClass, Integer index)

参数说明

  • enumClass: 枚举类类型
  • index: 枚举中自定义的index属性值

使用示例

java
String description = EnumsUtil.getDescriptionByIndex(MsgTypeEnum.class, 3); // 返回 "代理审核"

使用规范

  1. 枚举类定义要求
  • 包含index、name和description三个属性(非必须)
  • index属性建议使用包装类型Integer
  • 使用@Getter和@AllArgsConstructor注解
  1. 工具类使用规则
  • 枚举类中index属性按照顺序从0开始
  • 枚举中index属性直观显示顺序
  • 枚举中name和description属性做业务冗余

实际应用示例

场景1:数据库值转换

java
// 数据库存储的枚举index Integer dbValue = 2; // 转换为显示名称 String displayName = EnumsUtil.getNameByIndex(MsgTypeEnum.class, dbValue); // 输出:"报名审核"

场景2:枚举描述获取

java
// 业务配置的枚举index Integer configValue = 4; // 获取完整描述 String fullDescription = EnumsUtil.getDescriptionByIndex(MsgTypeEnum.class, configValue); // 输出:"提现核销"

完整代码实现

1. 枚举工具类 EnumsUtil.java

java
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.EnumUtil; import cn.hutool.core.util.ReflectUtil; import com.trial.drug.common.enums.AgentStatusEnum; import com.trial.drug.common.enums.MsgTypeEnum; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Objects; /** * <b>枚举类工具类</b><br> * 使用规则:<br> * &emsp;&emsp;1、枚举类中index属性按照顺序从0开始<br> * &emsp;&emsp;2、枚举中index属性直观显示顺序<br> * &emsp;&emsp;3、枚举中name属性和description属性做业务冗余 */ @Slf4j @SuppressWarnings({"unchecked", "unused"}) public class EnumsUtil { private EnumsUtil() { } /** * 根据枚举类型和原生有序索引获取枚举名称 * * @param enumClass枚举类型 * @param originIndex 原生有序索引 * @return name * <p> * 枚举包含两个个属性 * @see String name 名称 */ public static <T extends Enum<T>> String getNameByOriginIndex(Class<T> enumClass, Integer originIndex) { T enumAt = EnumUtil.getEnumAt(enumClass, originIndex); if (Objects.isNull(enumAt)) { log.error("Could not find enum by {}", originIndex); return CharSequenceUtil.EMPTY; } return (String) ReflectUtil.getFieldValue(enumAt, "name"); } /** * 根据枚举类型和index获取name * * @param enumClass 枚举类型 * @param indexindex * @return name */ public static <T extends Enum<T>> String getNameByIndex(Class<T> enumClass, Integer index) { List<Integer> indexObjList = EnumUtil.getFieldValues(enumClass, "index").stream().map(Integer.class::cast).toList(); for (int i = 0; i < indexObjList.size(); i++) { if (Objects.equals(indexObjList.get(i), index)) { T enumAt = EnumUtil.getEnumAt(enumClass, i); return (String) ReflectUtil.getFieldValue(enumAt, "name"); } } return CharSequenceUtil.EMPTY; } /** * 根据枚举类型和index获取description * * @param enumClass 枚举类型 * @param indexindex * @return description */ public static <T extends Enum<T>> String getDescriptionByIndex(Class<T> enumClass, Integer index) { List<Integer> indexObjList = EnumUtil.getFieldValues(enumClass, "index").stream().map(Integer.class::cast).toList(); for (int i = 0; i < indexObjList.size(); i++) { if (Objects.equals(indexObjList.get(i), index)) { T enumAt = EnumUtil.getEnumAt(enumClass, i); return (String) ReflectUtil.getFieldValue(enumAt, "description"); } } return CharSequenceUtil.EMPTY; } public static void main(String[] args) { String name = EnumsUtil.getNameByIndex(MsgTypeEnum.class, 3); String description = EnumsUtil.getDescriptionByIndex(MsgTypeEnum.class, 3); System.out.println(name); System.out.println(description); } }

2. 枚举类示例 MsgTypeEnum.java

java
import lombok.AllArgsConstructor; import lombok.Getter; /** * 消息类型:1 项目审核、2 报名审核、3 代理审核、4 提现核销 */ @Getter @AllArgsConstructor public enum MsgTypeEnum { PROJECT_AUDIT(1, "项目审核", "项目审核"), APPLY_AUDIT(2, "报名审核", "报名审核"), AGENT_AUDIT(3, "代理审核", "代理审核"), WITHDRAW_COMMISSION(4, "提现核销", "提现核销"), ; private final Integer index; private final String name; private final String description; }

设计优势

  1. 解耦性强:业务代码不直接依赖具体枚举值
  2. 维护方便:枚举变更只需修改枚举类定义
  3. 类型安全:通过泛型保证类型安全
  4. 扩展性好:可轻松添加新的转换方法

注意事项

  1. 确保枚举类属性命名与工具类查找的字段名一致
  2. 处理不存在的index时会返回空字符串(非null)
  3. 大量调用时考虑添加缓存优化
  4. 原生索引和自定义index的区别要明确

总结

本文介绍的枚举工具类提供了一套完整的枚举值转换解决方案,通过合理的封装,简化了枚举在业务系统中的使用。工具类结合Hutool的强大功能,既保证了灵活性又提供了足够的健壮性。在实际项目中,可以根据具体需求进一步扩展功能,如添加反向查找、批量转换等方法,使其更加强大和实用。