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()等