枚举类型主要用于将一组相似的值定义到一种类型中,与常量的定义相似,但可以为声明的变量提供更大的取值范围。
java
例如,当咱们定义一组颜色值来表示彩虹时,能够定义一个以下的常量类型数组
public static class RainbowColor{ //定义彩虹颜色值 public static final int RED = 1; public static final int ORANGE = 1; public static final int YELLOW = 2; public static final int GREEN = 3; public static final int CYAN = 4; public static final int BLUE = 5; public static final int PURPLE = 6; }
而后就能够在须要使用的时候直接引用这些变量。
安全
类型不安全:因为颜色常量的对应值是整数形,因此程序执行过程当中颇有可能给颜色变量传入一个任意的整数值,致使出现错误;服务器
没有命名空间:颜色常量是RainbowColor类的属性,没有本身的命名空间,因此在须要使用的时候须要经过该类来访问;性能
一致性差:由于整形枚举属于编译期常量,因此编译过程完成后,全部客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的枚举整数值后或者增长新的枚举值后,全部引用地方代码都须要从新编译,不然运行时刻就会出现错误。this
Java将枚举类型的定义转变为了一个功能完整的类的定义,因此枚举类型使用很是灵活,能够添加任意属性和方法,实现任意接口;spa
Java 平台为 Enum 类型提供了高质量的实现,好比默认实现 Comparable 和 Serializable 接口;code
使用枚举类型能够扩大switch语句的适用范围,Java JDK 5.0 以前,switch 的值只可以是简单类型,好比 int、byte、short、char, 有了枚举类型以后,就可使用对象了。
对象
enum 关键字加上名称和大括号包含起来的枚举值体,如:接口
enum RainbowColor{RED, ORANGE,YELLOW, GREEN, CRAN, BLUE, PURPLE}
//定义一个表示星期的枚举类型 public enum Week{ Mon(1), Tue(2), Wed(3), Thu(4), Fri(5), Sat(6), Sun(7); //枚举类型属性 index,表示星期的值 private int index; //构造方法,注意是pricate的 private Week(int weekIndex){ this.index = weekIndex; } //枚举类型方法 public int getIndex(){ return this.index; } }
以上代码自定义了一个枚举类型,在该自定义的枚举类型中设置了类型私有属性和构造方法以及其余方法。
注意:枚举类型的构造方法只能被private和friendly修饰,而不可以使用public和protected修饰符,由于枚举对象的取值是事先给定的,没法在程序中动态设置。
EnumSet 是一个针对枚举类型的高性能的 Set 接口实现。EnumSet 中装入的全部枚举对象都必须是同一种类型,在其内部,是经过 bit-vector 来实现,也就是经过一个 long 型数。EnumSet 支持在枚举类型的全部值的某个范围中进行迭代。
enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun } for(WeekDayEnum day : EnumSet.range(WeekDayEnum.Mon, WeekDayEnum.Fri)) { System.out.println(day); }
EnumMap 也是一个高性能的 Map 接口实现,用来管理使用枚举类型做为 keys 的映射表,内部是经过数组方式来实现。EnumMap 将丰富的和安全的 Map 接口与数组快速访问结合到一块儿,若是你但愿要将一个枚举类型映射到一个值,你应该使用 EnumMap。
// 定义一个 EnumMap 对象,映射表主键是日期枚举类型,值是颜色枚举类型 private static Map<WeekDayEnum, RainbowColor> schema = new EnumMap<WeekDayEnum, RainbowColor>(WeekDayEnum.class); static{ // 将一周的每一天与彩虹的某一种色彩映射起来 for (int i = 0; i < WeekDayEnum.values().length; i++) { schema.put(WeekDayEnum.values()[i], RainbowColor.values()[i]); } } System.out.println("What is the lucky color today?"); System.out.println("It's " + schema.get(WeekDayEnum.Sat));