枚举工具类

枚举工具类

很多个枚举类都需要用到通过 value值 来获取对应的 name 值

最简单的方式是在每一个枚举类定义一个静态方法,遍历所有实例对象,根据传入的 value 值找到对应的 name 值

嗯… 有点不优雅

抽离出上面的逻辑,通过反射的方式做一个通用的工具类

  • 传入所需要的枚举类的 class 对象和对应的 value 值
  • 根据 class 对象获取该枚举类的所有枚举实例对象、getValue 方法对象、getName 方法对象
  • 遍历枚举实例对象,分别执行该对象的getValue 方法 和 getName 方法
  • 比较获得想要的 name
package com.czh.common.utils;

import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Method;
import java.util.Objects;

/**
 * 枚举类的工具类
 *
 * @author 
 * @date 2/22/2024
 */
public class EnumUtils {
    private static final String GET_NAME = "getName";
    private static final String GET_VALUE = "getValue";

    /**
     * 通过传入枚举类的 class 对象,和属性值 value,获取对应 name 的值
     * <p>此方法只适用于:</p>
     * <p>1、该枚举类存在 getName方法 和 getValue方法</p>
     * <p>2、通过 value 获取对应的 name 值,如果不存在就返回 null </p>
     *
     * @param value
     * @param clazz 枚举类 class 对象
     * @return
     */
    public static String getNameByValue(String value,Class<? extends Enum<?>> clazz) {
        String result = null;
        if (StringUtils.isEmpty(value) || Objects.isNull(clazz)) {
            return result;
        }

        Enum<?>[] enumConstants = clazz.getEnumConstants();
        try {
            Method nameMethod = clazz.getMethod(GET_NAME);
            Method valueMethod = clazz.getMethod(GET_VALUE);

            nameMethod.setAccessible(true);
            valueMethod.setAccessible(true);
            for (Enum<?> enumConstant : enumConstants) {
                Object invoke = valueMethod.invoke(enumConstant);
                if (value.equals(invoke)) {
                    result = (String) nameMethod.invoke(enumConstant);
                    break;
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        return result;
    }
}

测试一下

package org.example.enums;

/**
 * 证件类型枚举类
 *
 * @author
 * @date 2023/11/22
 */
public enum CertificateTypeEnum {
    GENERIDENT("1","一代身份证"),
    IDENTITY("2","二代身份证");

    private String value;
    private String name;

    CertificateTypeEnum(String value, String name) {
        this.value = value;
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public String getName() {
        return name;
    }


    public static void main(String[] args) {
        String homeretper = EnumUtils.getNameByValue("1", CertificateTypeEnum.class);
        // 输出 “一代身份证”
        System.out.println(homeretper);
    }
}


  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值