Java数据类型在实际开发中的应用二枚举类型
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。在JDK1.5之前,人们用接口来描述这一种数据类型。
1.5以后引入枚举
一:枚举类基本语法
定义:
创建枚举类型要使用 enum 关键字,如果是想声明简单枚举,属性之间用逗号相隔 ;如果是属性带id,类似(male(1))这种还需要一个带id的构造方法
简单枚举类:
public enum ColorEnum { red, green, yellow, blue; }
枚举像普通的类一样可以添加属性和方法,如下
public enum Gender { MALE(0), // 男 FEMALE(1); // 女 int id; Gender(int id) { this.id = id; } public int getId() { return id; } }
如果不加构造器,直接在 “类型后边加(1)” 这种形式会报错,如下:
enum ColorEnum { red(1), green(2), yellow(3), blue(4);//编译出错:The constructor ColorEnum(int) is undefined }
因为枚举类的本质是一个Enum类,所以它可以加一些自定义的方法:比如·上边的getId()
使用:
可以用来foreach,switch传入枚举变量, case 是枚举内定义的每一个类型。
Gender gender = Gender.women switch (gender) { case male: System.out.println("male"); break; case female: System.out.println("female"); break;
int
compareTo(E o)
比较此枚举与指定对象的顺序。
Class<E>
getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
String
name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int
ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String
toString()
返回枚举常量的名称,它包含在声明中。
static
<T extends Enum<T>> T
valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
二:web项目中应用枚举
@Enumerated private Gender gender;//entity类
我们看一下Gender的配置
ublic enum Gender { MALE(0), // 男 FEMALE(1); // 女 int id; Gender(int id) { this.id = id; } public int getId() { return id; } }
,如果调用的原声的dao,查询出来的结果是Map
userVO.setGender(Gender.valueOf((String) map.get("gender")));//如果查询出来的是Map,则通过 Gender.valueOf(方法得到想要的枚举
如果是hibernate,则会不需要我们去关系到底查询出来的是什么,只需要指导是枚举类型即可
List<UserVO> userVOList = new ArrayList<UserVO>(); try { String queryString = "select * from User U left join U.institutions INS where INS.institution.id = '" + id + "' order by U.code"; userList = userDao.query(queryString);//如果是调用hibernate,查询出来不需要调用valueOf()方法 if (userList != null && userList.size() > 0) { } }
三 :原理分析
参照了java enum(枚举)使用详解 + 总结,非常感谢
enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译实际上是生成了一个类,该类继承了java.lang.Enum<E>。所以, enum本质上 java 编译器帮我们做了语法的解析和编译的一个普通的类。
唯一的区别,是枚举隐式继承了Enum,所以不可以在继承 ..
EnumTest test = EnumTest.TUE; ... System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName()); //输出结果是getDeclaringClass(): com.dtsz.enumTest.EnumTest
四:EnumSet,EnumMap 的应用
EnumSet和EnumMap是枚举的比较重要的用处。他们是操作枚举对象的工具类。具体的细节推荐去看一下Java 枚举用法详解,在这里,我简单的总结一下:
EnumSet
是枚举类型的高性能Set
实现。它要求放入它的枚举常量必须属于同一枚举类型。 EnumMap
是专门为枚举类型量身定做的Map
实现。虽然使用其它的Map实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用EnumMap会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值。这使得EnumMap的效率非常高。
/ EnumSet的使用 System.out.println("EnumSet展示"); EnumSet<ErrorCodeEn> errSet = EnumSet.allOf(ErrorCodeEn.class); for (ErrorCodeEn e : errSet) { System.out.println(e.name() + " : " + e.ordinal()); } // EnumMap的使用 System.out.println("EnumMap展示"); EnumMap<StateMachine.Signal, String> errMap = new EnumMap(StateMachine.Signal.class); errMap.put(StateMachine.Signal.RED, "红灯"); errMap.put(StateMachine.Signal.YELLOW, "黄灯"); errMap.put(StateMachine.Signal.GREEN, "绿灯"); for (Iterator<Map.Entry<StateMachine.Signal, String>> iter = errMap.entrySet().iterator(); iter.hasNext();) { Map.Entry<StateMachine.Signal, String> entry = iter.next(); System.out.println(entry.getKey().name() + " : " + entry.getValue()); }
Java数据类型在实际开发中的应用二枚举类型的更多相关文章
- Java 数据类型在实际开发中应用
在前边的博文中,我已经介绍了Java核心的容器IO等,现在我来说一下java中的数据类型.在java中,一切东西皆为对象(这句话意思是java中绝大数情况都用对象),极少数不是对象的,也存在与之对应的 ...
- Java数据类型在实际开发中的应用一
在前边的博文中,我已经介绍了Java核心的容器IO等,现在我来说一下java中的数据类型.在java中,一切东西皆为对象(这句话意思是java中绝大数情况都用对象),极少数不是对象的,也存在与之对应的 ...
- Java 数据类型在实际开发中应用二枚举
在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的.在JDK1.5之前,人们用接口来描述这一种数据类型. 1. ...
- Java 反射在实际开发中的应用
运行时类型识别(RTTI, Run-Time Type Information)是Java中非常有用的机制,在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一 ...
- [转]Java 反射在实际开发中的应用
一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2 :RTT ...
- 游戏开发中IIS常见支持MIME类型文件解析
游戏开发中IIS常见支持MIME类型文件解析 .apkapplication/vnd.android .ipaapplication/vnd.iphone .csbapplication/octet- ...
- Java 泛型在实际开发中的应用
java泛型是对Java语言的类型系统的一种扩展,泛型的本质就是将所操作的数据类型参数化.下面我会由浅入深地介绍Java的泛型. 一:泛型出现的背景 在java代码里,你会经常发现类似下边的代码: p ...
- Android学习探索之Java 8 在Android 开发中的应用
前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...
- Java IO在实际开发中的应用
IO是java绕不过去的槛,在开发中io无处不在, 正如同 世界上本没有路,java io写多了,也就知道了大体是什么意思,在读完thinking in java 感觉就更清晰了,结合具体的业务场景, ...
随机推荐
- MySql学习笔记(一) —— 关键字的使用
1.distinct关键字 作用:检索出有不同值的列,比如一个商品表中存在供应商vend_id,一个供应商会对应很多商品,我们要查找有多少供应商,就可以用到该关键字去重. select distinc ...
- Detailed Information for Outputted Files from Somatic Mutation Annotators(annovar 注释文件条目详细解释)
CONTENTS *_annoTable.txt (ANNOVAR) *_annoTable.txt (SnpEff) *_genelist.txt (ANNOVAR & SnpEff) db ...
- .net—— webservice的新建、发布、使用(最全、最简单)【原创】
网上有很多关于webservice资料,但大部分都不完整,其中还要很大部分是转载的--.这个悲剧了,自己都没试过能不能用就不负责任的转载. 所以今天对webservice的新建.发布.使用最一个全面. ...
- canvas 画钟表
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 最新开源DBLayer,原来数据库操作可以这么简单
DBLayer,我最近开源的数据库轻量级orm框架,目前支持sqlserver.mysql.oracle, 特别做了分页的封装. 这个框架从七八年前开始逐渐升级而来,也经历了不少项目,希望可以将大家从 ...
- PHP:win7 ASP.NET环境与PHP(WAMP)环境如何共存
经验地址:http://jingyan.baidu.com/article/495ba8410f794d38b30ede89.html 笔记本以前安装过asp.net,启用了Windows的IIS服务 ...
- “java.lang.IllegalArgumentException: Failed to evaluate expression ‘ROLE_USER’”报错的解决
这个问题出现在Spring Security的相关配置中,找到原来的这一行: <security:intercept-url pattern="/**" access=&qu ...
- Vulkan Tutorial 20 Vertex buffer creation
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 在Vulkan中,缓冲区是内存的一块区域,该区域用于向显卡 ...
- Python os模块实例之遍历目录及子目录指定扩展名的文件
需求:在该目录下有很多子目录(如下图,截图了部分),现要从该目录和所有子目录下找到所有扩展名为.meta的文件,并获取文件中第二行guid的值(': '后面的),然后将所有guid的值输出到另一文件中 ...
- CSS3学习系列之盒样式(一)
盒的基本类型 在css中,使用display属性来定义盒的类型,总体上来说,css中的盒分为block类型与inline类型 inline-block类型 inline-block类型是在css2.1 ...