概述
枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。
语法解析
public enum ColorEnum {
RED,BLUE,GREEN
}
反编译后
public final class ColorEnum extends Enum
{
//返回存储枚举实例的数组的副本。values()方法通常用于foreach循环遍历枚举常量。
public static ColorEnum[] values()
{
return (ColorEnum[])$VALUES.clone();
}
//根据实例名获取实例
public static ColorEnum valueOf(String s)
{
return (ColorEnum)Enum.valueOf(ColorEnum, s);
}
//私有构造方法,这里调用了父类的构造方法,其中参数s对应了常量名,参数i代表枚举的一个顺序(这个顺序与枚举的声明顺序对应,用于oridinal()方法返回顺序值)
private ColorEnum(String s, int i)
{
super(s, i);
}
//我们定义的枚举在这里声明了三个 ColorEnum的常量对象引用,对象的实例化在static静态块中
public static final ColorEnum RED;
public static final ColorEnum BLUE;
public static final ColorEnum GREEN;
//将所有枚举的实例存放在数组中
private static final ColorEnum $VALUES[];
static
{
RED = new ColorEnum("RED", 0);
BLUE = new ColorEnum("BLUE", 1);
GREEN = new ColorEnum("GREEN", 2);
//将所有枚举的实例存放在数组中
$VALUES = (new ColorEnum[] {
RED, BLUE, GREEN
});
}
}
现在我们在枚举类中增加自己的字段以及一些辅助方法,如下:
public enum ColorEnum {
RED("red","红色"),GREEN("green","绿色"),BLUE("blue","蓝色");
//防止字段值被修改,增加的字段也统一final表示常量
private final String key;
private final String value;
private ColorEnum(String key,String value){
this.key = key;
this.value = value;
}
//根据key获取枚举
public static ColorEnum getEnumByKey(String key){
if(null == key){
return null;
}
for(ColorEnum temp:ColorEnum.values()){
if(temp.getKey().equals(key)){
return temp;
}
}
return null;
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
}
反编译后的代码
public final class ColorEnum extends Enum
{
public static ColorEnum[] values()
{
return (ColorEnum[])$VALUES.clone();
}
public static ColorEnum valueOf(String s)
{
return (ColorEnum)Enum.valueOf(ColorEnum, s);
}
//构造方法在原基础上加上我们新增的两个形参
private ColorEnum(String s, int i, String s1, String s2)
{
super(s, i);
key = s1;
value = s2;
}
//自定义方法,通过key值获得对应的枚举对象
public static ColorEnum getEnumByKey(String s)
{
if(null == s)
return null;
ColorEnum acolorenum[] = values();
int i = acolorenum.length;
for(int j = 0; j < i; j++)
{
ColorEnum colorenum = acolorenum[j];
if(colorenum.getKey().equals(s))
return colorenum;
}
return null;
}
public String getKey()
{
return key;
}
public String getValue()
{
return value;
}
public static final ColorEnum RED;
public static final ColorEnum GREEN;
public static final ColorEnum BLUE;
//我们自定义的两个字段
private final String key;
private final String value;
private static final ColorEnum $VALUES[];
static
{
RED = new ColorEnum("RED", 0, "red", "\u7EFE\u3223\u58CA");
GREEN = new ColorEnum("GREEN", 1, "green", "\u7F01\u80EF\u58CA");
BLUE = new ColorEnum("BLUE", 2, "blue", "\u9483\u6FCA\u58CA");
$VALUES = (new ColorEnum[] {
RED, GREEN, BLUE
});
}
}
总结
- 继承Enum类
- 构造函数必须是private
- 编译器帮我们生成了每个常量实例和一个常量数组实例
- values方法返回所有常量实例的数组
- valueOf方法返回常量名所对应的枚举实例