1 enum概述
枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。
在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代。而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。
enum Season {SPRING(1, "春"),SUMMER(2, "夏"),AUTUMN(3, "秋"),WINTER(4, "冬");private Integer val;private String value;Season(Integer val, String value) {this.val = val;this.value = value;}public Integer getVal() {return val;}public void setVal(Integer val) {this.val = val;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}/*** 根据val获取枚举对象** @param value* @return*/public static Season getEnum(Integer val) {for (Season item : Season.values()) {if (item.getVal().equals(val)) {return item;}}return null;}/***根据value获取枚举对象*/public static Season getEnumByName(String value) {for (Season item : Season.values()) {if (item.getValue().equals(value)) {return item;}}return null;}}
2 enum实现原理
具体,我们对Season类进行反编译
进入dos: windows+r cmd
指定目录:cd /d E:\demo\out\production\myProject\enumDemo
通过javap命令对字节码进行反汇编:javap -c -l Season.class
final class enumDemo.Season extends java.lang.Enum<enumDemo.Season> {public static final enumDemo.Season SPRING;public static final enumDemo.Season SUMMER;public static final enumDemo.Season AUTUMN;public static final enumDemo.Season WINTER;public static enumDemo.Season[] values();public static enumDemo.Season valueOf(java.lang.String);public java.lang.Integer getVal();public void setVal(java.lang.Integer);public java.lang.String getValue();public void setValue(java.lang.String);public static enumDemo.Season getEnum(java.lang.Integer);public static enumDemo.Season getEnumByName(java.lang.String);static {};}
我们看到,对与枚举类,有很多值的注意的点:
- 枚举类在经过编译后确实是生成了一个扩展了java.lang.Enum的类
- 枚举类是final的,因此我们无法再继承它了
- 我们定义的每个枚举值都是该类中的一个成员,且成员的类型仍然是Season类型
- 枚举类中被默认增加了许多静态方法,例如values()等
