Java枚举(Enum)类型使用的正确姿势
关于Java Enum的介绍及原理参见
Java枚举(Enum)类型的基本介绍与原理探求
Enum类型的基本使用
定义一个枚举类的主要作用就是在逻辑代码中对某个变量的值进行比较。同样以季节的枚举类SeasonEnum为例,看一下以下比较方式:
SeasonEnum season = SeasonEnum.SPRING;Assert.assertTrue(season.equals(SeasonEnum.SPRING));
也可以使用compareTo方法比较,类似:
Assert.assertTrue(season.compareTo(SeasonEnum.SPRING)==0);
compareTo()是用来比较两个枚举成员定义时的顺序,通过位置比较两个成员是否相同。
但是现在问题来了, 一般应用中的变量的值很多是从数据库获取,而数据库中不会存储Enum类型实例的值,而是存储字符串或整型。字符串、整型如何和定义的枚举类的成员进行比较呢?
字符串变量与枚举成员比较
比如有一个字符串变量seasonStr ,从数据库获取的值是SPRING,方便起见,定义变量如下:
String seasonStr = "SPRING";
通过上面的那篇介绍, 知道了自定义枚举类在编译的时候会继承java.lang.Enum
,在java.lang.Enum
这个类中可以找到一些父类方法用于比较, 主要的方式有两种。
- 将字符串转换为枚举成员与枚举成员比较(valueOf(String))
SeasonEnum season = SeasonEnum.valueOf(seasonStr);
- 将枚举成员转换为字符串与字符串比较(name()或者toString())
String tranSeasonStr = SeasonEnum.SPRING.name();
也可以直接使用toString()方法
String tranSeasonStr = SeasonEnum.SPRING.toString();
整型变量与枚举成员比较
如果变量是整型呢?比如:
int iSeason = 0;
java.lang.Enum
提供了ordinal()方法用于获取成员的索引位置,号码从0开始,示例代码如下:
@Testpublic void intVsEnum() {int iSeason = 0;int iTranSeason = SeasonEnum.SPRING.ordinal();Assert.assertTrue(iSeason==iTranSeason);}
自定义构造函数和方法
如果枚举定义和数据库的栏位值的设定保持一致的话,以上的使用方式已经足够,但在实际开发中,可能会有如下场景:
枚举类的成员全部使用大写,比如SPRING、SUMMER,但是数据库的栏位值使用单词的方式,即首字母大写,比如Spring,Summer。这样的话比较起来稍显麻烦,需要将字符串转大写后比较,也可以在枚举类中通过增加一个参数的构造函数,并提供返回该参数值的Get方法,比如:
public enum Season2Enum {SPRING("Spring"), SUMMER("Summer"), AUTUMN("Autumn"), WINTER("Winter");private String value;Season2Enum(String value) {this.value = value;}public String getValue() {return value;}
}
- 成员使用新的构造函数构造。
- 构造函数的參數可以是多个。
- 属性和函数需要定义在成员的下面,Java要求先定义enum成员实例,所以在enum实例序列最后加上一个分号,后面再添加方法,添加的方法可以是构造函数和普通方法。
使用的示例代码如下:
@Test public void constructEnum() {String seasonStr = "Spring";String tranSeasonStr = Season2Enum.SPRING.getValue();Assert.assertTrue(seasonStr.equals(tranSeasonStr));}
枚举类的常用方法
汇总一下枚举类的常用方法包括:
- values() : 以数组返回所有成员
- vauleOf() : 将字符串转换为枚举实例
- name(): 返回成员的名字
- toString():返回成员的名字,可以覆写
- compareTo(): 比较两个枚举成员定义时的顺序
- ordinal() : 获取枚举成员的索引位置
枚举的其他使用场景
除了用作常量进行比较,枚举类还可以直接使用在Switch分支语句,比如:
@Testpublic void enumSwitch() {SeasonEnum season = SeasonEnum.SPRING;switch (season) {case SPRING:System.out.println("花开了");break;case SUMMER:System.out.println("天热了");break;case AUTUMN:System.out.println("结果了");break;case WINTER:System.out.println("下雪了");break;default:}}
建议规范
- 类名最好加上Enum后缀
- 成员名全大写
- 单词间使用下划线分隔
- 如果应用中有较多的枚举类,也可以将多个枚举类合并到一个文件中定义
Java枚举(Enum)类型使用的正确姿势相关推荐
- Java枚举(Enum)类型的基本介绍与原理探求
Enum枚举类型 Enum的全写是Enumeration,这个词的翻译是列举.逐条陈述.细目.在程序语言中,枚举类型是一种特殊的数据类型(常用的数据类型比如字符串.整型),这种数据类型的变量值限定在固 ...
- Java 枚举(enum) 7种常见的用法
在JDK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是 ...
- Java枚举(enum)常用的用法总结
Java枚举[enum] Java枚举(enum)七种常见的用法汇总如下: 用法一:常量 用法二:switch 用法三:向枚举中添加新方法 用法四:覆盖枚举的方法 用法五:实现接口 用法六:使用接口组 ...
- 枚举(enum)类型
关键字enum 可以将一组具名的值的有限集合创建一种新的类型,而这些具名的值可以作为常规的程序使用.创建enum 时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum .下面是一 ...
- [转载] java 枚举Enum源码解析
参考链接: 使用Java枚举 应用场景 枚举是单例模式中的一种.面试官系统之设计模式(单例模式) 简单来讲就是只能实例化一次,线程安全且性能高.枚举通常用来列举一个类型的有限实例集合,我们可以使用常量 ...
- java中enum类型的使用
java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我 ...
- Java 枚举(enum) 详解7种常见的用法<详细>
JDK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便. 大师兄我[大师兄]又加上自己的理解,来帮助各位理解一下 ...
- Java 枚举(enum) 详解7种常见的用法-小白笔记
目录 用法一:常量 用法二:switch 用法三:向枚举中添加新方法 用法四:覆盖枚举的方法 用法五:实现接口 用法六:使用接口组织枚举 用法七:关于枚举集合的使用 用法一:常量 在JDK1.5 之前 ...
- Java 枚举(enum) 六种常用的方法详解
JDK1.5引入了新的类型--枚举,在java中虽然枚举只是一个很小的功能,却给我们带来了很大的方便. 首先我们要了解几个概念,enum是没有构造函数的,准确的来说是没有public类型的构造函数, ...
最新文章
- SpringMVC之源码分析--ViewResolver(四)
- oracle设置表字段小写,将oracle中的字段和表名全部修改为小写
- Educational Codeforces Round 12 D. Simple Subset 最大团
- Python 生成器与列表解析
- 管理任务执行-有效执行
- 不是计算机专业及其相关专业,对软件编程一窍不通,能学好编程吗?
- 生成jacoco报告_jacoco生成的覆盖率文件
- AV音响和HiFi音响有什么区别?
- JQuery Ajax 解析
- 排序算法(二)Sort with Swap(0,*)
- c截取字符串中的一部分_2019年!史上最全Python基础题(50道题详解)持续更新中-第二篇...
- Python官方开发文档(中文版)
- multisim红绿灯元器件在哪里_实验二Multisim交通灯仿真.ppt
- 使用VLC-QT开源库开发流媒体播放器
- 羊皮卷之七-我要笑遍世界(中英对照)
- 用户邀请码的生成方法
- 零售3.0时代,国民品牌都市丽人一次成功的变革
- 微信公众号花式排版技巧分享
- J酒店上海中心天之锦餐厅成为全球建筑物中最高的景观餐厅
- javaweb课程设计:基于websocket的网络聊天室(所有的资源和代码还有详细步骤我都会提供)
热门文章
- 锋利的Jquery摘要
- 搬砖的也能学Python----if - elif 语句
- [Android]Android四大组件之Service总结
- firefox os 2.0版模拟器QQ初体验
- [ubuntu] ubuntu13.04 64bit,安装FastDFS4.06过程遇到的问题和解决方案
- 使用 Request.QueryString 接受参数时,跟编码有关的一些问题
- 解决Azure中COULD NOT LOAD FILE OR ASSEMBLY问题
- js的跨域问题和解决办法
- 解决Ubuntu 18.04中文输入法的问题
- C# Winform控件对透明图片重叠时导致图片不透明的解决方法