Java编程思想》中有这么一句话:“有时恰恰因为它,你才能够‘优雅而干净’地解决问题”——这句话说的是谁呢?就是本篇的主角——枚举(Enum)——大家鼓掌了。
在之前很长时间一段时间里,我都不怎么用枚举,因为总感觉它没什么用处——这其实就是“自我认知”的短见。当一个人一直蹲在自己的深井里而不敢跳出来的话,那他真的只能看到井口那么大点的天空。
随着时间的推移,我做的项目越来越多,和枚举见面的机会也越来越多,于是我就渐渐地对它越来越有兴趣,研究得多了,才发现原来枚举如此的优秀。
一、枚举的常规用法
一个精简的枚举非常的干净优雅,见下例。

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

我们来遍历输出一下枚举:

二、作为switch的判断条件
使用枚举作为switch语句判断条件能让我们的代码可读性更强,示例如下。

在通过case关键字判断的时候,可以直接使用枚举值,非常简洁。另外,在编译期间限定类型,可以有效的避免越界的情况——字符串常量类型在作为switch判断条件的时候很容易因为误写而发生越界问题。
三、枚举实现单例
《Effective Java》一书中对使用枚举实现单例的方式推崇备至:

我觉得“虽然还没有广泛采用”几个字可以去掉了,时至今日,大家应该都知道:使用枚举实现单例是一种非常好的方式。对于新手小白想更轻松的学好Java提升,Java架构,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,扩列下我尉(同英):CGMX9880 【教程/工具/方法/解疑】
先来看“双重校验锁”实现的单例:

再来看枚举实现的单例:

不比不知道,一比吓一跳啊!枚举方式的单例简单到爆——为了不至于看起来太过精简,我还加了一个输出“我很快乐”的方法。
枚举实现的单例可轻松地解决两个问题:
线程安全问题。因为Java虚拟机在加载枚举类的时候,会使用ClassLoader的loadClass方法,这个方法使用了同步代码块来保证线程安全。
避免反序列化破坏单例。因为枚举的反序列化并不通过反射实现。

四、枚举可与数据库交互
我们可以配合Mybatis将数据库字段转换为枚举类型。现在假设有一个数据库字段check_type的类型如下:

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

CheckType枚举类比我们刚开始见到的那个Chenmo枚举类要复杂一些。
第一,CheckType新添加了构造方法,还有两个字段,key为int型,text为String型。
第二,CheckType中有一个public static CheckType parse(Integer index)方法,可将一个Integer通过key的匹配转化为枚举类型。
那么现在,我们可以在Mybatis的配置文件中使用typeHandler将数据库字段转化为枚举类型。对于新手小白想更轻松的学好Java提升,Java架构,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,扩列下我尉(同英):CGMX9880 【教程/工具/方法/解疑】

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

CheckTypeHandler转换器的类源码如下:

CheckTypeHandler 的核心功能就是调用CheckType枚举类的parse()方法对数据库字段进行转换。
五、枚举会比静态常量更消耗内存吗?
说完枚举最常用的4个知识点后,我们来讨论一下“枚举会比静态常量更消耗内存吗?”这个话题——简书上有人问这样的问题,还有很多人参与回答。

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

Java——枚举:优雅而干净的enum相关推荐

  1. java枚举 数字_java 枚举

    Java中枚举的线程安全性及序列化问题 --枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字 ...

  2. java 枚举 接口_java枚举接口

    java中的枚举类 枚举类(enum),与class和interface关键字地位相同. 枚举类是一个特殊的类,可以有自己的成员变量.方法.构造器,可以实现一个或多个接口.一个java源文件中只能有一 ...

  3. java枚举 赋值_java 枚举 - java 枚举构造函数赋值-java 枚举 set 赋值-嗨客网

    Java枚举教程 我们已经了解了 Java枚举详解 语法 [public] enum 枚举类型名称{ 枚举对象1,枚举对象2,枚举对象3...枚举对象n; } 参数 参数 描述 [public] 可选 ...

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

    来源:沉默王二(ID:cmower) <Java编程思想>中有这么一句话:"有时恰恰因为它,你才能够'优雅而干净'地解决问题"--这句话说的是谁呢?就是本篇的主角--枚 ...

  5. java枚举和枚举类_Java枚举:您拥有优雅,优雅和力量,这就是我所爱!

    java枚举和枚举类 当Java 8即将面世时,您确定您对Java 5中引入的枚举很熟悉吗? Java枚举仍然被低估了,很可惜,因为它们比您想象的要有用,它们不仅仅用于通常的枚举常量! Java枚举是 ...

  6. Java枚举:您拥有优雅,优雅和力量,这就是我所爱!

    当Java 8即将面世时,您确定您对Java 5中引入的枚举很了解吗? Java枚举仍然被低估了,很可惜,因为它们比您想象的要有用,它们不仅仅用于通常的枚举常量! Java枚举是多态的 Java枚举是 ...

  7. Java 枚举(enum)详解

    概念: Java1.5发行版本中增加了新的引用类型--枚举类型(enum type).枚举类型是指由一组固定的常量组成合法值的类型.在Java虚拟机中,枚举类在进行编译时会转变成普通的Java类. 创 ...

  8. java 枚举(enum) 详细用法

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  9. Java枚举enum以及应用:枚举实现单例模式

    枚举作为一个常规的语言概念,一直到Java5才诞生不得不说有点奇怪,以至于到现在为止很多程序员仍然更喜欢用static final的形式去命名常量而不使用,一般情况下,Java程序员用这种方式去实现枚 ...

最新文章

  1. 存在量词后必须用合取式?-数学
  2. /dev/sda2 is mounted; will not make a filesystem here!
  3. R语言连接MySQL报错:could not run statement: The used command is not allowed with this MySQL version
  4. android系统属性获取及设置
  5. 希捷推2TB 2.5英寸SSHD和5TB 2.5英寸机械硬盘
  6. javap(反汇编命令)详解
  7. C++之操作符重载探究(七):==运算符重载
  8. Transact-SQL命令语法-数据表
  9. hadoop2.7.3+hbase1.2.5配合起来使用的一个小问题,备注一下
  10. SVN分支管理那些事儿
  11. 用计算机弹生僻字乐谱,生僻字 E调(拇指琴卡林巴琴弹奏谱)
  12. Mac 忘记管理员名和密码
  13. 问题 C: 神奇的口袋
  14. SUBMAIL短信平台API接口-Message/send
  15. Bzoj4698: [Sdoi2008]Sandy的卡片
  16. vsftpd参数cmds_allowed
  17. 甲骨文中间件与主数据管理平台
  18. 【案例】用 turtle 绘制一个月饼
  19. 如何使用kodi Mac安装中文插件
  20. uni-app 官方组件使用

热门文章

  1. 内联函数的意义和使用
  2. html怎么显示数学公式,怎么使用html数学公式显示库MathJax - js笔记
  3. 虚拟机状态错误_学会这3招,分分钟迁移业务繁忙虚拟机!
  4. 中考数学不准使用计算机,中考数学蒙题技巧
  5. 爬虫python 新闻,Python爬虫实例--爬取人民网新闻
  6. 西门子cpu指示灯含义_【技成周报28期】西门子全系列常见问题解答分享
  7. datagrip调试存储过程_PLC控制柜是什么?当PLC程序设置完后,如何调试能不烧毁PLC?...
  8. matlibplot 一张图画多个曲线_从一张风景照中就学会的SinGAN模型,究竟是什么神操作?| ICCV 2019最佳论文...
  9. java加载js_Java加载js
  10. efcore 批量_EFCore批量操作内幕