定义

  一个事物的所有值的集合。

枚举类型的属性

  因为枚举类型所代表的是一个事物的所有值的集合,所以枚举类型应具有的属性为:

  1. 枚举类型所具有的值是不可变的。
  2. 具有所有的值

枚举的作用

  限定值的范围,通常可以用来限制接口的参数的取值范围。

枚举的实现原理

  通过使用反编译命令javap我们可以得出一些理解:

  1. 编译器将枚举类型编译为普通的class类。
  2. 枚举中的每一个枚举值编译为“public static final 类型 枚举值”的形式。
  3. 编译器编译之后增加了一个静态块,在此静态块中创建一个新的对象并将此对象赋值给第2点中的静态对象。

使用javap -c 反编译结果为:

public final class Season extends java.lang.Enum<Season> {  public static final Season SPIRNG;  public static final Season SUMMER;  public static final Season AUTUMN;  public static final Season WINTER;  public static Season[] values();    Code:       0: getstatic     #1                  // Field $VALUES:[LSeason;       3: invokevirtual #2                  // Method "[LSeason;".clone:()Ljava/lang/Object;       6: checkcast     #3                  // class "[LSeason;"       9: areturn  public static Season valueOf(java.lang.String);    Code:       0: ldc           #4                  // class Season       2: aload_0       3: invokestatic  #5                  // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;       6: checkcast     #4                  // class Season       9: areturn  static {};    Code:       0: new           #4                  // class Season       3: dup       4: ldc           #7                  // String SPIRNG       6: iconst_0       7: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V      10: putstatic     #9                  // Field SPIRNG:LSeason;      13: new           #4                  // class Season      16: dup      17: ldc           #10                 // String SUMMER      19: iconst_1      20: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V      23: putstatic     #11                 // Field SUMMER:LSeason;      26: new           #4                  // class Season      29: dup      30: ldc           #12                 // String AUTUMN      32: iconst_2      33: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V      36: putstatic     #13                 // Field AUTUMN:LSeason;      39: new           #4                  // class Season      42: dup      43: ldc           #14                 // String WINTER      45: iconst_3      46: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V      49: putstatic     #15                 // Field WINTER:LSeason;      52: iconst_4      53: anewarray     #4                  // class Season      56: dup      57: iconst_0      58: getstatic     #9                  // Field SPIRNG:LSeason;      61: aastore      62: dup      63: iconst_1      64: getstatic     #11                 // Field SUMMER:LSeason;      67: aastore      68: dup      69: iconst_2      70: getstatic     #13                 // Field AUTUMN:LSeason;      73: aastore      74: dup      75: iconst_3      76: getstatic     #15                 // Field WINTER:LSeason;      79: aastore      80: putstatic     #1                  // Field $VALUES:[LSeason;      83: return}

源代码:

public enum Season {    SPIRNG,    SUMMER,    AUTUMN,    WINTER;}