源码仅用于测试,请勿用于商用。源码来自网络,如有侵权,请联系我下架。
java枚举的小技巧分享

1. 前言

Java枚举在开发中是非常实用的。今天再来分析几个小技巧并且回答一些同学的的疑问。首先要说明的是我的枚举建立在以下的范式之中:

枚举统一接口范式

2. 如何把枚举值绑定的下拉列表

这种场景非常常见,如果你把状态、类别等属性封装成枚举的结构,就像下面一样,一个标识对应一个状态,这是典型的下拉列表结构。

public enum EnabledEnum implements Enumerator {
    /**
     * Disable status enum.
     */
    DISABLE(0, "不可用"),
    /**
     * Enable status enum.
     */
    ENABLE(1, "可用");

    private final int value;
    private final String description;

    EnabledEnum(int value, String description) {
        this.value = value;
        this.description = description;
    }

    @Override
    public int value() {
        return this.value;
    }

    @Override
    public String description() {
        return this.description;
    }
}

前端希望能够获取这些状态作为下拉列表的填充,你该如何解析封装它呢?这里我有两个办法,第一个你可以从 JSON类库Jackson优雅序列化Java枚举类一文获得解决方案;第二种更加简单一些,写一个工具类就可以了。

public static <E extends Enum<?> & Enumerator> Map<Integer, String> enumToMap(Class<E> clazz) {
    E[] enumConstants = clazz.getEnumConstants();
    Map<Integer, Object> map = new LinkedHashMap<>();
    for (E e : enumConstants) {
        map.put(e.value(), e.description());
    }
    return map;
}

这里用了Java 8的新特性 附加约束。也就是说extends后面可以在通过&符号附加额外约束,可以重复使用,注意必须为接口类型,不能为抽象类或者其他Class。表示泛型的上界受到多个约束的制约。<E extends Enum<?> & Enumerator>可以解读为E必须为一个枚举类而且同时还必须实现Enumerator接口。

为什么实现Enumerator接口?第一个好处是可以规定统一的范式;第二个好处是解析的时候不用转换了。

我尝试用Stream来封装但是发现过于复杂了,虽然成功了但是有点难以理解,这里也分享一下:

public static <E extends Enum<?> & Enumerator> Map<Integer, String> enumToOptions(Class<E> enumClazz){
       // 合并时检查 key 是否重复
    BinaryOperator<String> merge = (u, v) -> {
        throw new IllegalStateException(String.format("Duplicate key %s", u));
    };
    Enumerator[] enumConstants = enumClazz.getEnumConstants();
    return Stream.of(enumConstants)
          .collect(Collectors.toMap(Enumerator::value,
                  Enumerator::description,
                  merge,LinkedHashMap::new));

}

3. 如何根据值找到枚举

这种也很常见,最直接的方式是写一个 switch 语句。但是每个类都写一个就非常繁琐。所以这个也可以写一个工具类,这次用Stream就简单的多了。

public static <E extends Enum<?> & Enumerator> Optional<E> getEnumByValue(Class<E> enumClazz, final Integer value){

    return Stream.of(enumClazz.getEnumConstants())
            .filter(enumerator -> Objects.equals(enumerator.code(),value))
            .findAny();
}

返回Optional是因为有可能给出的value没有对应的枚举。

4. 总结

今天分享了两个小工具类来操作枚举,不光运用了枚举的一些知识,同时也使用了Java 8的三个新特性:泛型附加约束Optional**和Stream API

阅读全文
资源下载
下载价格免费
使用用途仅限于测试、实验、研究为目的,禁止用于一切商业运营,本团队不承担使用者在使用过程中的任何违法行为负责所有源码请自测!不保证你源码完整性有效性所有源码都是全网搜集
原文链接:https://bcbccb.cn/4633.html,转载请注明出处。 免责声明:本资源并未取得原始权利人的授权,不可商用,仅可用于学习分析底层代码,CSS等,禁止用于商业行为。如因擅自商用引起的相关纠纷及法律责任,由使用人全部承担。支持正版,人人有责,请于下载后24小时内删除,谢谢支持!
1

评论0

七星游戏源码搭建教程详细文档说明
七星游戏源码搭建教程详细文档说明
5分钟前 有人购买 去瞅瞅看

站点公告

本站所提供的源码(主题/插件/应用源码)等资源仅供学习交流

禁止使用商业用途,否则产生的一切后果将由下载用户自行承担!

有部分资源为网上收集或仿制而来,若侵犯了您的合法权益,请来信通知我们.

目前会员大酬宾,终身会员现价299金币。近期调整价格

赶快加入,机会不等人! 立即参与

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录

zh_CNChinese