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

枚举父接口

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张图片

你可能感兴趣的:(JavaSE,Java新特性,枚举)