1、枚举概念
在Java中枚举使用enum关键字表示,它是一种非常有用的特性,可以理解为具体特定性质的类。Enum不仅Java有,C和C++也有这个概念。例如:
1 public enum Family { 2 3 FATHER, 4 5 MOTHER, 6 7 SON, 8 9 DAUGHTER; 10 11 }
这是一个Family枚举类,总共有4个值,因为枚举类型都是常量,所以用大写字母表示
1 //使用枚举 2 3 class UseEnum { 4 5 public static void main(String[] args) { 6 7 Family f = Family.FATHER; 8 9 System.out.println(f); 10 11 } 12 13 }
运行结果:
2、枚举特性
(1)当创建完enum枚举类后,编译器会自动为enum添加toString()方法,能够方便显示enum实例的具体名字。除了toString()方法,编译器还会添加ordinal()方法,这个方法用来表示enum常量的声明顺序,以及values()方法显示顺序的值。
1 public enum Family { 2 3 FATHER, 4 5 MOTHER, 6 7 SON, 8 9 DAUGHTER; 10 11 } 12 13 class EnumUse { 14 15 public static void main(String[] args) { 16 17 for (Family family : Family.values()) { 18 19 System.out.println(family + ",ordinal_" + family.ordinal()); 20 21 } 22 23 24 25 } 26 27 }
运行结果:
(2)枚举可以静态导入包,导入静态包的时候可以不用输入枚举类名.变量,可以直接用常量。使用enum和static关键字就能做到静态导入包。
枚举和普通类一样,除了枚举中能够方便快捷的定义常量,日常开发用的public static final XXX都可以用枚举类定义,枚举中也能定义属性和方法。
1 package day07; 2 3 4 5 public enum OrdinalEnum { 6 7 WEST("west"), 8 9 EAST("east"), 10 11 SOUTH("south"), 12 13 MORTH("north"); 14 15 String description; 16 17 18 19 OrdinalEnum(String description) { 20 21 this.description = description; 22 23 } 24 25 26 27 public String getDescription() { 28 29 return description; 30 31 } 32 33 34 35 public void SetDescripiton(String description) { 36 37 this.description = description; 38 39 } 40 41 42 43 public static void main(String[] args) { 44 45 for (OrdinalEnum ordinalEnum : OrdinalEnum.values()) { 46 47 System.out.println(ordinalEnum.getDescription()); 48 49 } 50 51 } 52 53 }
运行结果:
(3)Switch可以和enum一起使用,例如构造一个小型状态机:
1 package day07; 2 3 4 5 enum Signal { 6 7 GREEN, YELLOW, RED 8 9 } 10 11 12 13 public class TrafficLight { 14 15 Signal color = Signal.RED; 16 17 18 19 public void change() { 20 21 switch (color) { 22 23 case RED: 24 25 color = Signal.GREEN; 26 27 break; 28 29 case GREEN: 30 31 color = Signal.RED; 32 33 break; 34 35 case YELLOW: 36 37 color = Signal.YELLOW; 38 39 break; 40 41 } 42 43 } 44 45 }
(4)Enum隐式的继承与Enum类,Enum类位于java.lang包下,可以自动引用。Class类中有三个关于Enum的方法:getEnumConstants():T[],getEnumConstantsShared():T[],isEnum():boolea。前两个用于获取enum常量,isEnum用于判断是否是枚举类型。
3、EnumSet和EnumMap
- EnumSet是JDK1.5引入的,EnumSet的设计充分考虑了速度因素,使用EnumSet可以作为Enum的替代者,因为它的效率比较高。
- EnumMap是一种特殊的Map,它要求其中的key键值是来自一个enum。因为EumMap速度也非常快,所以可以使用EumMap的key进行快速查找。
枚举是Java中很小的功能,但是这个技巧有时候能够让代码变得优雅和简洁。