(参考资料:深入理解java enum

1、原理:对编译后的class文件javap反编译可以看出,定义的枚举类继承自java.lang.Enum抽象类且通过public static final定义了几个常量作为枚举常量。示例:

 1 //定义枚举类型
 2 enum Day {
 3     MONDAY, TUESDAY, WEDNESDAY,
 4     THURSDAY, FRIDAY, SATURDAY, SUNDAY
 5 }
 6 
 7 //对应的完整内容
 8 //反编译Day.class
 9 final class Day extends Enum
10 {
11     //编译器为我们添加的静态的values()方法
12     public static Day[] values()
13     {
14         return (Day[])$VALUES.clone();
15     }
16     //编译器为我们添加的静态的valueOf()方法,注意间接调用了Enum也类的valueOf方法
17     public static Day valueOf(String s)
18     {
19         return (Day)Enum.valueOf(com/zejian/enumdemo/Day, s);
20     }
21     //私有构造函数
22     private Day(String s, int i)
23     {
24         super(s, i);
25     }
26      //前面定义的7种枚举实例
27     public static final Day MONDAY;
28     public static final Day TUESDAY;
29     public static final Day WEDNESDAY;
30     public static final Day THURSDAY;
31     public static final Day FRIDAY;
32     public static final Day SATURDAY;
33     public static final Day SUNDAY;
34     private static final Day $VALUES[];
35 
36     static 
37     {    
38         //实例化枚举实例
39         MONDAY = new Day("MONDAY", 0);
40         TUESDAY = new Day("TUESDAY", 1);
41         WEDNESDAY = new Day("WEDNESDAY", 2);
42         THURSDAY = new Day("THURSDAY", 3);
43         FRIDAY = new Day("FRIDAY", 4);
44         SATURDAY = new Day("SATURDAY", 5);
45         SUNDAY = new Day("SUNDAY", 6);
46         $VALUES = (new Day[] {
47             MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
48         });
49     }
50 }
枚举类反编译后的源码

相关文章: