【精品】关于枚举的高级用法

枚举父接口

java 复制代码
public interface BaseEnum {
    Integer getCode();

    String getLabel();

    /**
     * 根据值获取枚举
     *
     * @param code
     * @param clazz
     * @return
     */
    static <E extends Enum<E> & BaseEnum> E getEnumByCode(Integer code, Class<E> clazz) {
        Objects.requireNonNull(code);
        // 获取类型下的所有枚举
        EnumSet<E> allEnums = EnumSet.allOf(clazz);
        return allEnums.stream()
                .filter(e -> e.getCode().equals(code))
                .findFirst()
                .orElse(null);
    }

    /**
     * 根据文本标签获取枚举
     *
     * @param label
     * @param clazz
     * @return
     */
    static <E extends Enum<E> & BaseEnum> E getEnumByLabel(String label, Class<E> clazz) {
        Objects.requireNonNull(label);
        // 获取类型下的所有枚举
        EnumSet<E> allEnums = EnumSet.allOf(clazz);
        return allEnums.stream()
                .filter(e -> e.getLabel().equals(label))
                .findFirst()
                .orElse(null);
    }

    /**
     * 根据值获取文本标签
     *
     * @param code
     * @param clazz
     * @return
     */
    static <E extends Enum<E> & BaseEnum> String getLabelByCode(Integer code, Class<E> clazz) {
        // 根据值获取枚举
        E matchEnum = getEnumByCode(code, clazz);

        if (matchEnum != null) {
            return matchEnum.getLabel();
        }
        throw new RuntimeException("根据值获取文本标签失败");
    }


    /**
     * 根据文本标签获取值
     *
     * @param label
     * @param clazz
     * @return
     */
    static <E extends Enum<E> & BaseEnum, T> int getCodeByLabel(String label, Class<E> clazz) {
        // 根据文本获取枚举
        E matchEnum = getEnumByLabel(label,clazz);

        if (matchEnum != null) {
            return matchEnum.getCode();
        }
        throw new RuntimeException("根据文本标签获取值失败");
    }


}

枚举

java 复制代码
public enum StateEnum implements BaseEnum {

    /**
     * 启用
     */
    ENABLE(1, "启用"),

    /**
     * 禁用
     */
    DISABLE(0, "禁用");

    @Getter
    private final Integer code;

    @Getter
    private final String label;

    StateEnum(Integer code, String label) {
        this.code = code;
        this.label = label;
    }

}

测试代码

java 复制代码
 public static void main(String[] args) {
    //根据值获取枚举
    final StateEnum s1 = BaseEnum.getEnumByCode(1, StateEnum.class);
    System.out.println(s1);

    //根据标签获取枚举
    final StateEnum s2 = BaseEnum.getEnumByLabel("启用", StateEnum.class);
    System.out.println(s2);

    //根据值获取标签
    final String label = BaseEnum.getLabelByCode(1, StateEnum.class);
    System.out.println(label);

    //根据标签获取值
    final int code = BaseEnum.getCodeByLabel("禁用", StateEnum.class);
    System.out.println(code);
}

结果

相关推荐
_whitepure2 个月前
Java中常见的语法糖
java·枚举·lambda·泛型·内部类·java语法糖·自动拆箱装箱
小李的便利店3 个月前
LeetCode-day09-419. 甲板上的战舰
java·算法·leetcode·枚举·遍历
Tisfy3 个月前
LeetCode 3067.在带权树网络中统计可连接服务器对数目:枚举根
算法·leetcode·题解·模拟·枚举
Tisfy4 个月前
LeetCode 2951.找出峰值:模拟(遍历)
leetcode·题解·模拟·枚举·遍历
EQUINOX14 个月前
一次遍历,LeetCode 2391. 收集垃圾的最少总时间
算法·枚举
xhchen20234 个月前
第 129 场 LeetCode 双周赛题解
算法·leetcode·前缀和·动态规划·枚举
Farewell_me4 个月前
C语言自定义类型枚举、枚举类型的定义、枚举的特点、以及自定义类型联合体、联合类型的定义、联合的特点、联合大小的计算、联合判断大小端 的介绍
c语言·枚举·联合体
我是镜流的狗6 个月前
日期问题(蓝桥杯)
c++·算法·蓝桥杯·枚举
Betty’s Sweet7 个月前
探索C语言中的联合体与枚举:数据多面手的完美组合!
c语言·枚举·联合体