之前并没有注意到枚举这个知识点,因为之前在项目中并没有使用过枚举,可能是项目并不是很复杂的原因吧,今天看张孝祥老师的讲解,觉得,这个枚举真的有很多值得学习的地方,探究一下枚举的设计原理,底层到底是怎么回事。
一、枚举的介绍
1、枚举用于表示编程语言中的一组命名常量
例如,一副牌中的四个套装可以是四个名为Club,Diamond,Heart和Spade的枚举器,属于名为Suit的枚举类型。其他示例包括天然枚举类型(例如行星,星期几,颜色,方向等)。 当我们在编译时知道所有可能的值时使用枚举,例如菜单上的选择,舍入模式,命令行标志等。枚举类型中的常量集不必始终固定。
2、在Java中(从1.5开始),枚举使用枚举数据类型表示
Java枚举比C / C ++枚举更强大。在Java中,我们还可以向其中添加变量,方法和构造函数。枚举的主要目标是定义我们自己的数据类型(enumer数据类型)。
二、枚举的使用
简单的使用,一般都是直接定义一些值,其实本质是一个个的对象,但是其实枚举也有复杂的使用方法,下面是一个复杂的使用方法的例子:
其实从内部类就可以看出来,定义的那些值真的是enum关键字修饰的对象,重写了父类的抽象方法,注意:定义的对象必须放在最上面
1 public enum TrafficLamp { 2 3 RED(30) { 4 5 @Override 6 public TrafficLamp nextLamp() { 7 return GREEN; 8 } 9 }, 10 GREEN(45) { 11 12 @Override 13 public TrafficLamp nextLamp() { 14 return YELLOW; 15 } 16 }, 17 YELLOW(5) { 18 19 @Override 20 public TrafficLamp nextLamp() { 21 return RED; 22 } 23 }; 24 25 public abstract TrafficLamp nextLamp(); 26 27 private int time; 28 29 private TrafficLamp(int time){ 30 this.time = time; 31 } 32 }
三、枚举的原理
在第二个中其实已经介绍了一些枚举类的实际本质的东西,张孝祥老师用class类实现枚举,其中用到了内部类的概念,在编译之后,会形成四个class文件,内部类被编译成class文件。
1 public abstract class TrafficLamp2 { 2 3 /** 4 * 红灯 等待30秒 5 */ 6 public final static TrafficLamp2 RED = new TrafficLamp2(30) { 7 8 @Override 9 public TrafficLamp2 nextLamp() { 10 return GREEN; 11 } 12 13 @Override 14 public String toString() { 15 return "RED"; 16 } 17 }; 18 19 /** 20 * 绿灯 等待45秒 21 */ 22 public final static TrafficLamp2 GREEN = new TrafficLamp2(45) { 23 24 @Override 25 public TrafficLamp2 nextLamp() { 26 return YELLOW; 27 } 28 29 @Override 30 public String toString() { 31 return "GREEN"; 32 } 33 }; 34 35 /** 36 * 黄灯 等待5秒 37 */ 38 public final static TrafficLamp2 YELLOW = new TrafficLamp2(5) { 39 40 @Override 41 public TrafficLamp2 nextLamp() { 42 return RED; 43 } 44 45 @Override 46 public String toString() { 47 return "YELLOW"; 48 } 49 }; 50 51 public abstract TrafficLamp2 nextLamp(); 52 53 public abstract String toString(); 54 55 private int time; 56 57 /** 58 * 私有化构造方法 59 * 60 * @param time 61 */ 62 private TrafficLamp2(int time) { 63 this.time = time; 64 } 65 }