在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类;

在 Java 中使用 enum 关键字来定义枚举类,其地位与 class、interface 相同;

枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器 (只能使用 private 访问修饰符,所以无法从外部调用构造器,构造器只在构造枚举值时被调用);

一个 Java 源文件中最多只能有一个 public 类型的枚举类,且该 Java 源文件的名字也必须和该枚举类的类名相同,这点和类是相同的;

使用 enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口;

所有的枚举值都是 public static final 的,且非抽象的枚举类不能再派生子类;

枚举类的所有实例(枚举值)必须在枚举类的第一行显式地列出,否则这个枚举类将永远不能产生实例。列出这些实例(枚举值)时,系统会自动添加 public static final 修饰,无需程序员显式添加。

三:Enum 使用

1

packagecom.ljq.test;2
3 /**
4 * 枚举用法详解5 *6 *@authorjiqinlin7 *8 */
9 public classTestEnum {10 /**
11 * 普通枚举12 *13 *@authorjiqinlin14 *15 */
16 public enumColorEnum {17 red, green, yellow, blue;18 }19
20 /**
21 * 枚举像普通的类一样可以添加属性和方法,可以为它添加静态和非静态的属性或方法22 *23 *@authorjiqinlin24 *25 */
26 public enumSeasonEnum {27 //注:枚举写在最前面,否则编译出错
28 spring, summer, autumn, winter;29
30 private final static String position = "test";31
32 public staticSeasonEnum getSeason() {33 if ("test".equals(position))34 returnspring;35 else
36 returnwinter;37 }38 }39
40 /**
41 * 性别42 *43 * 实现带有构造器的枚举44 *45 *@authorjiqinlin46 *47 */
48 public enumGender{49 //通过括号赋值,而且必须带有一个参构造器和一个属性跟方法,否则编译出错50 //赋值必须都赋值或都不赋值,不能一部分赋值一部分不赋值;如果不赋值则不能写构造器,赋值编译也出错
51 MAN("MAN"), WOMEN("WOMEN");52
53 private finalString value;54
55 //构造器默认也只能是private, 从而保证构造函数只能在内部使用
56 Gender(String value) {57 this.value =value;58 }59
60 publicString getValue() {61 returnvalue;62 }63 }64
65 /**
66 * 订单状态67 *68 * 实现带有抽象方法的枚举69 *70 *@authorjiqinlin71 *72 */
73 public enumOrderState {74 /**已取消*/
75 CANCEL {public String getName(){return "已取消";}},76 /**待审核*/
77 WAITCONFIRM {public String getName(){return "待审核";}},78 /**等待付款*/
79 WAITPAYMENT {public String getName(){return "等待付款";}},80 /**正在配货*/
81 ADMEASUREPRODUCT {public String getName(){return "正在配货";}},82 /**等待发货*/
83 WAITDELIVER {public String getName(){return "等待发货";}},84 /**已发货*/
85 DELIVERED {public String getName(){return "已发货";}},86 /**已收货*/
87 RECEIVED {public String getName(){return "已收货";}};88
89 public abstractString getName();90 }91
92 public static voidmain(String[] args) {93 //枚举是一种类型,用于定义变量,以限制变量的赋值;赋值时通过“枚举名.值”取得枚举中的值
94 ColorEnum colorEnum =ColorEnum.blue;95 switch(colorEnum) {96 casered:97 System.out.println("color is red");98 break;99 casegreen:100 System.out.println("color is green");101 break;102 caseyellow:103 System.out.println("color is yellow");104 break;105 caseblue:106 System.out.println("color is blue");107 break;108 }109
110 //遍历枚举
111 System.out.println("遍历ColorEnum枚举中的值");112 for(ColorEnum color : ColorEnum.values()){113 System.out.println(color);114 }115
116 //获取枚举的个数
117 System.out.println("ColorEnum枚举中的值有"+ColorEnum.values().length+"个");118
119 //获取枚举的索引位置,默认从0开始
120 System.out.println(ColorEnum.red.ordinal());//0
121 System.out.println(ColorEnum.green.ordinal());//1
122 System.out.println(ColorEnum.yellow.ordinal());//2
123 System.out.println(ColorEnum.blue.ordinal());//3124
125 //枚举默认实现了java.lang.Comparable接口
126 System.out.println(ColorEnum.red.compareTo(ColorEnum.green));//-1127
128 //--------------------------
129 System.out.println("===========");130 System.err.println("季节为" +SeasonEnum.getSeason());131
132
133 //--------------
134 System.out.println("===========");135 for(Gender gender : Gender.values()){136 System.out.println(gender.value);137 }138
139 //--------------
140 System.out.println("===========");141 for(OrderState order : OrderState.values()){142 System.out.println(order.getName());143 }144 }145
146 }

四:枚举集合的使用

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型

JDK5.0 中在增加 Enum 类的同时,也增加了两个工具类 EnumSet 和 EnumMap,这两个类都放在 java.util 包中。EnumSet 是一个针对枚举类型的高性能的 Set 接口实现。EnumSet 中装入的所有枚举对象都必须是同一种类型,在其内部,是通过 bit-vector 来实现,也就是通过一个 long 型数。EnumSet 支持在枚举类型的所有值的某个范围中进行迭代。

你能够在每周七天日期中进行迭代,EnumSet 类提供一个静态方法 range 让迭代很容易完成:

打印结果如下:

EnumSet 还提供了很多个类型安全的获取子集的 of 方法,很容易取得子集:

打印结果如下:

与 EnumSet 类似,EnumMap 也是一个高性能的 Map 接口实现,用来管理使用枚举类型作为 keys 的映射表,内部是通过数组方式来实现。EnumMap 将丰富的和安全的 Map 接口与数组快速访问结合到一起,如果你希望要将一个枚举类型映射到一个值,你应该使用 EnumMap。