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

枚举父接口

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

结果

相关推荐
郝开16 小时前
Spring Boot 2.7.18(最终 2.x 系列版本)3 - 枚举规范定义:定义基础枚举接口;定义枚举工具类;示例枚举
spring boot·后端·python·枚举·enum
_OP_CHEN6 天前
算法基础篇:(三)基础算法之枚举:暴力美学的艺术,从穷举到高效优化
c++·算法·枚举·算法竞赛·acm竞赛·二进制枚举·普通枚举
咸鱼爱学习2 个月前
【题解】 [蓝桥杯 2019 省 B] 特别数的和
算法·职场和发展·蓝桥杯·模拟·枚举
hansang_IR2 个月前
【题解 | 两种做法】洛谷 P4208 [JSOI2008] 最小生成树计数 [矩阵树/枚举]
c++·算法·dfs·题解·枚举·最小生成树·矩阵树定理
ankleless3 个月前
C语言(10)——结构体、联合体、枚举
c语言·开发语言·零基础·枚举·结构体·联合体·自学
让我们一起加油好吗5 个月前
【基础算法】枚举(普通枚举、二进制枚举)
开发语言·c++·算法·二进制·枚举·位运算
别来无恙1495 个月前
Java枚举详解:从基础到高级应用
java·开发语言·枚举
咚咚轩6 个月前
蓝桥杯13届国B 完全日期
蓝桥杯·枚举·日期问题
Nelson_hehe7 个月前
Java基础第五章、面向对象程序设计
java·开发语言·枚举·垃圾回收机制·面向对象程序设计
小黑屋的黑小子7 个月前
【数据结构】反射、枚举以及lambda表达式
数据结构·面试·枚举·lambda表达式·反射机制