• Java枚举和enum


    Java编程思想》中有这么一句话:“有时恰恰因为它,你才能够‘优雅而干净’地解决问题”——这句话说的是谁呢?就是本篇的主角——枚举(Enum)——大家鼓掌了。
    在之前很长时间一段时间里,我都不怎么用枚举,因为总感觉它没什么用处——这其实就是“自我认知”的短见。当一个人一直蹲在自己的深井里而不敢跳出来的话,那他真的只能看到井口那么大点的天空
    随着时间的推移,我做的项目越来越多,和枚举见面的机会也越来越多,于是我就渐渐地对它越来越有兴趣,研究得多了,才发现原来枚举如此的优秀。
    1)枚举的常规用法
    一个精简的枚举非常的干净优雅,见下例。
    我们为沉默枚举创建了三个值,分别是王二、王三、王四。这段代码实际上调用了3次Enum(String name, int ordinal)(ordinal单词的意思为顺序),也就是:
    我们来遍历输出一下枚举:
    2)作为switch的判断条件
    使用枚举作为switch语句判断条件能让我们的代码可读性更强,示例如下。
    在通过case关键字判断的时候,可以直接使用枚举值,非常简洁。另外,在编译期间限定类型,可以有效的避免越界的情况——字符串常量类型在作为switch判断条件的时候很容易因为误写而发生越界问题。
    3)枚举实现单例
    《Effective Java》一书中对使用枚举实现单例的方式推崇备至:
    使用枚举实现单例的方法虽然还没有广泛采用,但是单元素的枚举类型已经成为实现Singleton的最佳方法。
    我觉得“虽然还没有广泛采用”几个字可以去掉了,时至今日,大家应该都知道:使用枚举实现单例是一种非常好的方式。
    先来看“双重校验锁”实现的单例:
    再来看枚举实现的单例:
     
    不比不知道,一比吓一跳啊!枚举方式的单例简单到爆——为了不至于看起来太过精简,我还加了一个输出“我很快乐”的方法。
    枚举实现的单例可轻松地解决两个问题:
    ①、线程安全问题。因为Java虚拟机在加载枚举类的时候,会使用ClassLoader的loadClass方法,这个方法使用了同步代码块来保证线程安全。
    ②、避免反序列化破坏单例。因为枚举的反序列化并不通过反射实现。
    4)枚举可与数据库交互
    我们可以配合Mybatis将数据库字段转换为枚举类型。现在假设有一个数据库字段check_type的类型如下:
    它对应的枚举类型为CheckType,代码如下:
     
    CheckType枚举类比我们刚开始见到的那个Chenmo枚举类要复杂一些。
    第一,CheckType新添加了构造方法,还有两个字段,key为int型,text为String型。
    第二,CheckType中有一个public static CheckType parse(Integer index)方法,可将一个Integer通过key的匹配转化为枚举类型。
    那么现在,我们可以在Mybatis的配置文件中使用typeHandler将数据库字段转化为枚举类型。
    其中checkType字段对应的类如下:
    CheckTypeHandler转换器的类源码如下:
    CheckTypeHandler 的核心功能就是调用CheckType枚举类的parse()方法对数据库字段进行转换。
    5)枚举会比静态常量更消耗内存吗?
    说完枚举最常用的4个知识点后,我们来讨论一下“枚举会比静态常量更消耗内存吗?”这个话题——知乎上有人问这样的问题,还有很多人参与回答。
    按我的理解,问这个问题的人就好像是在问“0.000,001”比“0.000,000,99”大吗?你说是吗?

    PS:如果大家在学习过程中遇到什么问题,或者缺乏相关的学习资料,可查看我的公告栏获取,有问题随问随答,还有我这段时间整理的一些Java学习手册,面试题,开发工具,PDF文档书籍教程,需要的话都可以免费分享给大家。

     
  • 相关阅读:
    【锁】java 锁的技术内幕
    【BlockingQueue】BlockingQueue 阻塞队列实现
    【多线程】获取多个线程任务执行完事件
    【spring cloud】源码分析(一)
    【spring boot】FilterRegistrationBean介绍
    【FAQ】服务下线
    解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)...
    实现人民币大写代码解析
    application.yml使用@符合问题:'@' that cannot start any token. (Do not use @ for indentation)
    Maven常见异常及解决方法---测试代码编译错误
  • 原文地址:https://www.cnblogs.com/lcywuwuwu/p/13992560.html
Copyright © 2020-2023  润新知