@ghimi
2018-10-06T15:46:28.000000Z
字数 2846
阅读 1003
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});}}