Java枚举:小小enum,优雅而干净

  • 时间:
  • 浏览:1
  • 来源:uu快3新平台_uu快3诀窍_讨论群

这样 现在,大伙都还都还可以 在Mybatis的配置文件中使用typeHandler将数据库字段转化为枚举类型。

按我的理解,问你这个 问题的人就好像是在问“0.000,001”比“0.000,000,99”大吗?你说是吗?

原文地址https://www.cnblogs.com/qing-gee/p/10455969.html

再来看枚举实现的单例:

    @Override

    public CheckType getNullableResult(ResultSet rs, String index) throws SQLException {

        return CheckType.parse(rs.getInt(index));

    }

    @Override

    public CheckType getNullableResult(ResultSet rs, int index) throws SQLException {

        return CheckType.parse(rs.getInt(index));

    }

    @Override

    public CheckType getNullableResult(CallableStatement cs, int index) throws SQLException {

        return CheckType.parse(cs.getInt(index));

    }

    @Override

    public void setNonNullParameter(PreparedStatement ps, int index, CheckType val, JdbcType arg3) throws SQLException {

        ps.setInt(index, val.getKey());

    }

}

大伙来遍历输出一下枚举:

其中checkType字段对应的类如下:

在通过case关键字判断的事先,都还都还可以 直接使用枚举值,非常简洁。另外,在编译期间限定类型,都还都还可以 有效的处里越界的情况汇报——字符串常量类型在作为switch判断条件的事先很容易以后误写而地处越界问题。

枚举实现的单例可轻松地处里另有另1个 问题:

在事先很长时间一段时间里,让人有为什么么用枚举,以后总感觉它没哪此用处——这嘴笨 以后 我“自我认知”的短见。当另有另1个 人时不时蹲在每个人的深井里而不敢时不时老出来语录,那他真的这样 看过井口这样 大点的天空

另有另1个 精简的枚举非常的干净优雅,见下例。

第一,CheckType新打上去了构造土办法,还有另有另1个 字段,key为int型,text为String型。

CheckTypeHandler转换器的类源码如下:

说完枚举最常用的另有另1个 知识点后,大伙来讨论一下“枚举会比静态常量更消耗内存吗?”你这个 话题——知乎上其他同学问另有另1个 的问题,还有以后 人参与回答。

先来看“双重校验锁”实现的单例:

不比真不知道,一比吓一跳啊!枚举土办法的单例简单到爆——为了不至于看起来太过精简,我还加了另有另1个 输出“我减慢乐”的土办法。

     INSTANCE;

    public void method() {

        System.out.println("我减慢乐!");

    }

}

大伙都还都还可以 配合Mybatis将数据库字段转换为枚举类型。现在假设有另有另1个 数据库字段check_type的类型如下:

第二,CheckType包含另有另1个 public static CheckType parse(Integer index)土办法,可将另有另1个 Integer通过key的匹配转化为枚举类型。

《Java编程思想》包含这样 语录:“有时恰恰以后它,你才都还都还可以 ‘优雅而干净’地处里问题”——这句话说的是谁呢?以后 我本篇的主角——枚举(Enum)——大伙鼓掌了。

使用枚举实现单例的土办法嘴笨 还这样 广泛采用,以后单元素的枚举类型以后成为实现Singleton的最佳土办法。

②、处里反序列化破坏单例。以后枚举的反序列化何必 通过反射实现。

使用枚举作为switch语录判断条件能让大伙的代码可读性更强,示类式下。

CheckType枚举比喻大伙刚开始英文见到的那个Chenmo枚举类要复杂化你这个。

①、进程池安全问题。以后Java虚拟机在加载枚举类的事先,会使用ClassLoader的loadClass土办法,你这个 土办法使用了同步代码块来保证进程池安全。

CheckTypeHandler 的核心功能以后 我调用CheckType枚举类的parse()土办法对数据库字段进行转换。

它对应的枚举类型为CheckType,代码如下:

Java枚举:小小enum,优雅而干净

    private String text;

    private CheckType(int key, String text) {

        this.key = key;

        this.text = text;

    }

    public int getKey() {

        return key;

    }

    public String getText() {

        return text;

    }

    private static HashMap<Integer,CheckType> map = new HashMap<Integer,CheckType>();

    static {

        for(CheckType d : CheckType.values()){

            map.put(d.key, d);

        }

    }

    public static CheckType parse(Integer index) {

        if(map.containsKey(index)){

            return map.get(index);

        }

        return null;

    }

}

我嘴笨 “嘴笨 还这样 广泛采用”有好多个字都还都还可以 打上去了,时至今日,大伙应该都知道:使用枚举实现单例是有三种非常好的土办法。

《Effective Java》一书中对使用枚举实现单例的土办法推崇备至:

随着时间的推移,我做的项目这样 来不多,和枚举见面的以后也这样 来不多,于是让人渐渐地对它这样 有兴趣,研究得多了,才发现另有另1个 枚举这样 的优秀。

    private String id;

    private CheckType checkType;

    public String getId() {

        return id;

    }

    public void setId(String id) {

        this.id = id;

    }

    public CheckType getCheckType() {

        return checkType;

    }

    public void setCheckType(CheckType checkType) {

        this.checkType = checkType;

    }

}

大伙为沉默枚举创建了另有另1个 值,分别是王二、王三、王四。这段代码实际上调用了3次Enum(String name, int ordinal)(ordinal单词的意思为顺序),也以后 我: