为什么需要使用枚举类型?
枚举类型主要用于将一组类似的值定义到一种类型中,与常量的定义类似,但能够为声明的变量提供更大的取值范围。
例如,当我们定义一组颜色值来表示彩虹时,可以定义一个如下的常量类型
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类的属性,没有自己的命名空间,所以在需要使用的时候需要通过该类来访问;
一致性差:因为整形枚举属于编译期常量,所以编译过程完成后,所有客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的枚举整数值后或者增加新的枚举值后,所有引用地方代码都需要重新编译,否则运行时刻就会出现错误。
枚举类型的优点:
Java将枚举类型的定义转变为了一个功能完整的类的定义,所以枚举类型使用非常灵活,可以添加任意属性和方法,实现任意接口;
Java 平台为 Enum 类型提供了高质量的实现,比如默认实现 Comparable 和 Serializable 接口;
使用枚举类型可以扩大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 :
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:
EnumMap 也是一个高性能的 Map 接口实现,用来管理使用枚举类型作为 keys 的映射表,内部是通过数组方式来实现。EnumMap 将丰富的和安全的 Map 接口与数组快速访问结合到一起,如果你希望要将一个枚举类型映射到一个值,你应该使用 EnumMap。
// 定义一个 EnumMap 对象,映射表主键是日期枚举类型,值是颜色枚举类型 private static Mapschema = new EnumMap (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));