Java語(yǔ)法糖系列四:枚舉類型

目錄:
Java語(yǔ)法糖系列一:可變長(zhǎng)度參數(shù)和foreach循環(huán)
http://www.lxweimin.com/p/628568f94ef8

Java語(yǔ)法糖系列二:自動(dòng)裝箱/拆箱和條件編譯
http://www.lxweimin.com/p/946b3c4a5db6

Java語(yǔ)法糖系列三:泛型與類型擦除
http://www.lxweimin.com/p/4de08deb6ba4

Java語(yǔ)法糖系列四:枚舉類型
http://www.lxweimin.com/p/ae09363fe734

Java語(yǔ)法糖系列五:內(nèi)部類和閉包
http://www.lxweimin.com/p/f55b11a4cec2


枚舉

在JVM字節(jié)碼文件結(jié)構(gòu)中,并沒(méi)有“枚舉”這個(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 "";
}}

編譯出來(lái)的代碼:

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打開(kāi)class文,代碼并沒(méi)有什么變化,唯一引起注意的是

JavaSugarEnum.values()  

變成了

 JavaSugarEnum[] arrayOfJavaSugarEnum = values();

說(shuō)明編譯出來(lái)的字節(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è)語(yǔ)法糖,編譯器幫我們做了語(yǔ)法的解析和編譯。
完全也可以自己實(shí)現(xiàn)一個(gè)枚舉類型。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,076評(píng)論 25 708
  • 目錄:Java語(yǔ)法糖系列一:可變長(zhǎng)度參數(shù)和foreach循環(huán)http://www.lxweimin.com/p/62...
    Eric新之助閱讀 3,073評(píng)論 1 6
  • 以下為轉(zhuǎn)載,作者:張大虎 原文名:自我成長(zhǎng)的正確打開(kāi)方式 1967年,美國(guó)心理學(xué)家馬丁·賽里格曼(Martin S...
    龍暢天下閱讀 421評(píng)論 3 1
  • 一 夜家有女初長(zhǎng)成,名喚夜魅,取傾國(guó)傾城之意。世人皆知,夜魅傾心于當(dāng)朝太子,可偏偏天意弄人,十七歲那一年,嫁...
    喵妹lora閱讀 822評(píng)論 2 1
  • 如果胡適要說(shuō)先秦沒(méi)有法家之名,這應(yīng)該是毫無(wú)爭(zhēng)議的,同理,先秦亦無(wú)道家、陰陽(yáng)家之名。但要說(shuō)先秦沒(méi)有法家之實(shí)、無(wú)道家之...
    曹無(wú)傷閱讀 317評(píng)論 0 0