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

枚举父接口

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("根据文本标签获取值失败");
    }


}

枚举

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

}

测试代码

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

结果

在这里插入图片描述

相关推荐

  1. Swift中高级

    2024-02-17 07:28:01       36 阅读
  2. 闲聊Swift关联

    2024-02-17 07:28:01       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-17 07:28:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-17 07:28:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-17 07:28:01       82 阅读
  4. Python语言-面向对象

    2024-02-17 07:28:01       91 阅读

热门阅读

  1. 指纹识别描述

    2024-02-17 07:28:01       62 阅读
  2. ubuntu20修改xorg.conf实现双屏幕输出

    2024-02-17 07:28:01       61 阅读
  3. 目标检测教程视频指南大全

    2024-02-17 07:28:01       52 阅读
  4. 收集域名信息

    2024-02-17 07:28:01       56 阅读
  5. 函数式编程要点

    2024-02-17 07:28:01       57 阅读
  6. python-使用ffmpeg批量修改文件的后缀名

    2024-02-17 07:28:01       53 阅读
  7. Rust中的模块路径和pub关键字详解

    2024-02-17 07:28:01       47 阅读