在实际编程中,每每存在着这样的“数据集”,它们的数值在程序中是稳定的,并且“数据集”中的元素是有限的。在JDK1.5以前,人们用接口来描述这一种数据类型。html
1.5之后引入枚举java
建立枚举类型要使用 enum 关键字,若是是想声明简单枚举,属性之间用逗号相隔 ;若是是属性带id,相似(male(1))这种还须要一个带id的构造方法web
简单枚举类:编程
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()post
能够用来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)
比较此枚举与指定对象的顺序。this
Class<E>
getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。url
String
name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int
ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String
toString()
返回枚举常量的名称,它包含在声明中。
static
<T extends Enum<T>> T
valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
@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是枚举的比较重要的用处。他们是操做枚举对象的工具类。具体的细节推荐去看一下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()); }