目錄:
Java語法糖系列一:可變長(zhǎng)度參數(shù)和foreach循環(huán)
http://www.reibang.com/p/628568f94ef8
Java語法糖系列二:自動(dòng)裝箱/拆箱和條件編譯
http://www.reibang.com/p/946b3c4a5db6
Java語法糖系列三:泛型與類型擦除
http://www.reibang.com/p/4de08deb6ba4
Java語法糖系列四:枚舉類型
http://www.reibang.com/p/ae09363fe734
Java語法糖系列五:內(nèi)部類和閉包
http://www.reibang.com/p/f55b11a4cec2
枚舉
在JVM字節(jié)碼文件結(jié)構(gòu)中,并沒有“枚舉”這個(gè)類型团驱。
Java的枚舉類型轿亮,會(huì)在編譯期被編譯成一個(gè)普通了類。直接看代碼吧:
package lab;
public enum JavaSugarEnum {
Enum1(1, "Enum1"),
Enum2(2, "Enum2"),
Enum3(3, "Enum3");
private int key;
private String value;
public int getKey() {
return key;
}
public String getValue() {
return value;
}
private JavaSugarEnum(int key, String value){
this.key = key;
this.value = value;
}
public String get(int key) {
for(JavaSugarEnum item : JavaSugarEnum.values()){
if(item.getKey() == key)
return item.getValue();
}
return "";
}}
編譯出來的代碼:
package lab;
public enum JavaSugarEnum
{
Enum1, Enum2, Enum3;
private int key;
private String value;
public int getKey()
{
return this.key;
}
public String getValue() {
return this.value;
}
public String get(int paramInt)
{
JavaSugarEnum[] arrayOfJavaSugarEnum = values();
int i = arrayOfJavaSugarEnum.length;
for (int j = 0; j < i; ++j) {
JavaSugarEnum localJavaSugarEnum =arrayOfJavaSugarEnum[j];
if (localJavaSugarEnum.getKey() == paramInt)
return localJavaSugarEnum.getValue();
}
return "";
}
}
用JD打開class文福贞,代碼并沒有什么變化,唯一引起注意的是
JavaSugarEnum.values()
變成了
JavaSugarEnum[] arrayOfJavaSugarEnum = values();
說明編譯出來的字節(jié)碼會(huì)有values()函數(shù)停士,那我們用javap命令再反編譯一下看一看字節(jié)碼
javap -c JavaSugarEnum
去掉匯編代碼得到:
Compiled from "JavaSugarEnum.java"
public final class lab.JavaSugarEnum extends java.lang.Enum{
public static final lab.JavaSugarEnum Enum1;
public static final lab.JavaSugarEnum Enum2;
public static final lab.JavaSugarEnum Enum3;
public static lab.JavaSugarEnum[] values();
public static lab.JavaSugarEnum valueOf(java.lang.String);
public int getKey();
public java.lang.String getValue();
public java.lang.String get(int);
static {};
}
可以看到Java枚舉編譯后實(shí)際上是生成了一個(gè)類挖帘,該類繼承了 java.lang.Enum<E>完丽,并添加了一個(gè)返回枚舉數(shù)組的values()方法和valueOf()方法。
所以Enum類型就是一個(gè)語法糖拇舀,編譯器幫我們做了語法的解析和編譯逻族。
完全也可以自己實(shí)現(xiàn)一個(gè)枚舉類型。