在Java开发中,枚举(Enum)是一种非常实用的数据类型,它能够帮助我们更好地组织和管理一组相关的常量。然而,在实际业务场景中,我们经常需要在枚举的索引(index)、名称(name)和描述(description)之间进行转换。本文将介绍一个强大的枚举工具类EnumsUtil
,它能帮助我们优雅地处理这些转换操作。
EnumsUtil
是一个基于Hutool工具集的枚举工具类,它提供了以下几种核心功能:
javapublic static <T extends Enum<T>> String getNameByOriginIndex(Class<T> enumClass, Integer originIndex)
参数说明:
enumClass
: 枚举类类型originIndex
: 枚举的原生有序索引(从0开始)使用示例:
javaString name = EnumsUtil.getNameByOriginIndex(MsgTypeEnum.class, 0);
// 返回 "PROJECT_AUDIT"
javapublic static <T extends Enum<T>> String getNameByIndex(Class<T> enumClass, Integer index)
参数说明:
enumClass
: 枚举类类型index
: 枚举中自定义的index属性值使用示例:
javaString name = EnumsUtil.getNameByIndex(MsgTypeEnum.class, 3);
// 返回 "代理审核"
javapublic static <T extends Enum<T>> String getDescriptionByIndex(Class<T> enumClass, Integer index)
参数说明:
enumClass
: 枚举类类型index
: 枚举中自定义的index属性值使用示例:
javaString description = EnumsUtil.getDescriptionByIndex(MsgTypeEnum.class, 3);
// 返回 "代理审核"
java// 数据库存储的枚举index
Integer dbValue = 2;
// 转换为显示名称
String displayName = EnumsUtil.getNameByIndex(MsgTypeEnum.class, dbValue);
// 输出:"报名审核"
java// 业务配置的枚举index
Integer configValue = 4;
// 获取完整描述
String fullDescription = EnumsUtil.getDescriptionByIndex(MsgTypeEnum.class, configValue);
// 输出:"提现核销"
javaimport 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>
*   1、枚举类中index属性按照顺序从0开始<br>
*   2、枚举中index属性直观显示顺序<br>
*   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);
}
}
javaimport 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;
}
本文介绍的枚举工具类提供了一套完整的枚举值转换解决方案,通过合理的封装,简化了枚举在业务系统中的使用。工具类结合Hutool的强大功能,既保证了灵活性又提供了足够的健壮性。在实际项目中,可以根据具体需求进一步扩展功能,如添加反向查找、批量转换等方法,使其更加强大和实用。