Java中的枚举--Enumeration

  之前并没有注意到枚举这个知识点,因为之前在项目中并没有使用过枚举,可能是项目并不是很复杂的原因吧,今天看张孝祥老师的讲解,觉得,这个枚举真的有很多值得学习的地方,探究一下枚举的设计原理,底层到底是怎么回事。

一、枚举的介绍

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 }
posted @ 2019-03-30 22:31  ssc在路上  阅读(1479)  评论(0编辑  收藏  举报