@ghimi
2018-10-06T15:46:28.000000Z
字数 2846
阅读 890
Java
枚举
枚举是JDK1.5 版本新增的特性(泛型,foreach等如今被广泛应用的特性也是有JDK1.5时所新增的),另外到了JDK1.6后switch语句支持枚举类型.
示例:
public enum ColorEnum{
RED,BLUE,GREEN
}
通过工具解析后class后获得的源代码(工具参考上面的链接)
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 stataic 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 ColoeEnum getEnumByKey(String key){
if(null == key){
return null;
}
for(ColorEnum temp:ColorEnum.values()){
if(temp.getKey.equals(key)){
return temp;
}
}
}
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
});
}
}