定义
一个事物的所有值的集合。
枚举类型的属性
因为枚举类型所代表的是一个事物的所有值的集合,所以枚举类型应具有的属性为:
- 枚举类型所具有的值是不可变的。
- 具有所有的值
枚举的作用
限定值的范围,通常可以用来限制接口的参数的取值范围。
枚举的实现原理
通过使用反编译命令javap我们可以得出一下结论:
- 编译器将枚举类型编译为final类型的class类。
- 枚举中的每一个枚举值编译为“public static final 类型 枚举值”的形式。
- 编译器编译之后增加了一个静态块,在此静态块中创建一个新的对象并将此对象赋值给第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;
}
由于枚举类型使用static块来进行初始化,所以枚举类型仅仅在每次类加载的时候初始化,这种特性可以用来实现单例模式参考我的另外一篇文章单例模式
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。