枚举高级应用

1.首先新建一个类存放枚举信息

public class DictItemBean {
    private String value;
    private String label;

    public static DictItemBean of(String value, String label) {
        final DictItemBean dictItemBean = new DictItemBean();
        dictItemBean.setValue(value);
        dictItemBean.setLabel(label);
        return dictItemBean;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }
}

2.定义一个静态数据池,存放枚举信息

public class StaticDictPool {

    /**
     * 用于存储字典数据
     */
    private static final Map<IDictItem, DictItemBean> dictItemMap = new ConcurrentHashMap<>();

    private StaticDictPool() {
    }

    /**
     * 往 map 中添加代码项
     */
    public static void putDictItem(IDictItem iCodeItem, String value, String label) {
        dictItemMap.put(iCodeItem, DictItemBean.of(value, label));
    }

    /**
     * 获取静态数据
     */
    static DictItemBean getDictItem(IDictItem iCodeItem) {
        return dictItemMap.get(iCodeItem);
    }
}

3.定义一个接口,接口默认的方法从池子中获取枚举信息

public interface IDictItem {

    /**
     * 通过value来获取enumClass中匹配的枚举对象
     *
     * @param enumClass 枚举类
     * @param value     代码
     * @param <T>       模板类型
     * @return 如果 enumClass为空, 返回 null, 否则返回枚举类中第一个匹配value的枚举对象
     */
    static <T extends IDictItem> T getByValue(Class<T> enumClass, String value) {
        if (enumClass == null) {
            return null;
        }
        //通过反射取出Enum所有常量的属性值
        for (T each : enumClass.getEnumConstants()) {
            //利用value进行循环比较,获取对应的枚举
            if (value.equals(each.value())) {
                return each;
            }
        }
        return null;
    }

    /**
     * 通过label来获取enumClass中匹配的枚举对象
     *
     * @param enumClass 枚举类
     * @param label     代码
     * @param <T>       模板类型
     * @return 如果 enumClass为空, 返回 null, 否则返回枚举类中第一个匹配label的枚举对象
     */
    static <T extends IDictItem> T getByLabel(Class<T> enumClass, String label) {
        if (enumClass == null) {
            return null;
        }
        //通过反射取出Enum所有常量的属性值
        for (T each : enumClass.getEnumConstants()) {
            //利用value进行循环比较,获取对应的枚举
            if (label.trim().equals(each.label())) {
                return each;
            }
        }
        return null;
    }

    /**
     * 通过 value 来获取 label
     *
     * @param enumClass 枚举类
     * @param value     枚举代码
     * @param <T>       模板类型
     * @return 如果 value为空
     */
    static <T extends IDictItem> String getLabelByValue(Class<T> enumClass, String value) {
        if (value == null) {
            return "";
        }
        IDictItem byValue = getByValue(enumClass, value);
        if (null == byValue) {
            return value;
        }
        return byValue.label();
    }

    /**
     * 通过 label 来获取 value
     *
     * @param enumClass 枚举类
     * @param label     枚举代码
     * @param <T>       模板类型
     * @return 如果 value为空
     */
    static <T extends IDictItem> String getValueByLabel(Class<T> enumClass, String label) {
        if (label == null) {
            return "";
        }
        label = label.trim();
        IDictItem byValue = getByLabel(enumClass, label);
        if (null == byValue) {
            return label;
        }
        return byValue.value();
    }

    String name();

    default String value() {
        return getItemBean().getValue();
    }

    default String label() {
        return getItemBean().getLabel();
    }

    default DictItemBean getItemBean() {
        return StaticDictPool.getDictItem(this);
    }

    default boolean isValue(String value) {
        return StringUtils.isNotBlank(value) && value.endsWith(value());
    }

}

4.自定义枚举,并将枚举添加到数据池中

public interface ArpArticleEnum {
    /**
     * 发布状态 (0初始状态 1上架状态 2下架状态)
     */
    enum ReleaseStatus implements IDictItem {

        INITIAL("0", "初始状态"), ON("1", "上架状态"), OFF("2", "下架状态");

        ReleaseStatus(String value, String label) {
            StaticDictPool.putDictItem(this, value, label);
        }
    }

    /**
     * 审核状态 (0待审核 1审核通过 2审核未通过)
     */
    enum AuditStatus implements IDictItem {

        INITIAL("0", "待审核"), PASS("1", "审核通过"), FAILED("2", "审核未通过");

        AuditStatus(String value, String label) {
            StaticDictPool.putDictItem(this, value, label);
        }
    }
}

5、代码中应用

6.添加工具方法,从value中获取label 

public class IDictMultiItem {

    public static final String SPLIT_SYMBOL = ",";

    private IDictMultiItem() {
    }

    /**
     * 通过value来获取enumClass中匹配的枚举对象
     *
     * @param enumClass 枚举类
     * @param value     代码
     * @param <T>       模板类型
     * @return 如果 enumClass为空, 返回 null, 否则返回枚举类中第一个匹配value的枚举对象
     */
    public static <T extends IDictItem> List<T> getByValue(Class<T> enumClass, String value) {
        if (enumClass == null || value.isEmpty()) {
            return Collections.emptyList();
        }
        String[] arr = value.split(SPLIT_SYMBOL);
        List<T> list = new ArrayList<>(arr.length);
        for (String str : arr) {
            //通过反射取出Enum所有常量的属性值
            for (T each : enumClass.getEnumConstants()) {
                //利用value进行循环比较,获取对应的枚举
                if (str.equals(each.value())) {
                    list.add(each);
                    break;
                }
            }
        }
        return list;
    }

    /**
     * 通过label来获取enumClass中匹配的枚举对象
     *
     * @param enumClass 枚举类
     * @param label     代码
     * @param <T>       模板类型
     * @return 如果 enumClass为空, 返回 null, 否则返回枚举类中第一个匹配label的枚举对象
     */
    public static <T extends IDictItem> List<T> getByLabel(Class<T> enumClass, String label) {
        if (enumClass == null || label.isEmpty()) {
            return Collections.emptyList();
        }
        String[] arr = label.split(SPLIT_SYMBOL);
        List<T> list = new ArrayList<>(arr.length);
        for (String str : arr) {
            //通过反射取出Enum所有常量的属性值
            for (T each : enumClass.getEnumConstants()) {
                //利用value进行循环比较,获取对应的枚举
                if (str.equals(each.label())) {
                    list.add(each);
                    break;
                }
            }
        }
        return list;
    }

    /**
     * 通过 value 来获取 label
     *
     * @param enumClass 枚举类
     * @param value     枚举代码
     * @param <T>       模板类型
     * @return 如果 value为空
     */
    public static <T extends IDictItem> String getLabelByValue(Class<T> enumClass, String value) {
        if (value == null) {
            return "";
        }
        List<T> list = getByValue(enumClass, value);
        if (list.isEmpty()) {
            return value;
        }
        return list.stream().map(IDictItem::label).collect(Collectors.joining(SPLIT_SYMBOL));
    }

    /**
     * 通过 label 来获取 value
     *
     * @param enumClass 枚举类
     * @param label     枚举代码
     * @param <T>       模板类型
     * @return 如果 value为空
     */
    static <T extends IDictItem> String getValueByLabel(Class<T> enumClass, String label) {
        if (label == null) {
            return "";
        }
        List<T> list = getByValue(enumClass, label);
        if (list.isEmpty()) {
            return label;
        }
        return list.stream().map(IDictItem::value).collect(Collectors.joining(SPLIT_SYMBOL));
    }
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值