Java 枚舉類型原理簡要分析

問題:枚舉是一種特殊的數據類型,通常用來列舉有限個、同類型的常量。它能保證參數的安全性,如方法聲明傳入的參數,必須是指定枚舉中的常量。但使用枚舉會比使用靜態變量多消耗更多的內存,那爲何枚舉這麼耗內存?java

先看下這段代碼:數組

public class TestEnumClass {
	public enum MyColor {red, green, blue};
	
	public static void main(String[] args) {
		MyColor mc = MyColor.red;
		MyColor mc1 = mc.red.green.blue;
		System.out.println(mc);
		System.out.println(mc1);
		
		switch(mc) {
		case red:
			System.out.println("red");
			break;
		case green:
			System.out.println("green");
			break;
		case blue:
			System.out.println("bule");
			break;
		default:
			System.out.println("default");
		}
	}
}

枚舉原理:安全

在上面的代碼中咱們定義了 MyColor 這個枚舉類型:.net

public enum MyColor {red, green, blue};

一、找到此枚舉的 .class 字節碼文件code

二、使用 jad 反編譯 TestEnumClass$MyColor.class 文件,生成 TestEnumClass$MyColor.jad 文件對象

jad 的下載地址:點擊下載blog

jad 的使用方法:點擊瞭解繼承

打開 .jad 文件獲得源碼以下:內存

public static final class TestEnumClass$MyColor extends Enum {

    public static TestEnumClass$MyColor[] values() {
        TestEnumClass$MyColor atestenumclass$mycolor[];
        int i;
        TestEnumClass$MyColor atestenumclass$mycolor1[];
        System.arraycopy(atestenumclass$mycolor = ENUM$VALUES, 0, atestenumclass$mycolor1 =
            new TestEnumClass$MyColor[i = atestenumclass$mycolor.length], 0, i);
        return atestenumclass$mycolor1;
    }

    public static TestEnumClass$MyColor valueOf(String s) {
        return (TestEnumClass$MyColor)Enum.valueOf(TestEnumClass$MyColor, s);
    }

    public static final TestEnumClass$MyColor red;
    public static final TestEnumClass$MyColor green;
    public static final TestEnumClass$MyColor blue;
    private static final TestEnumClass$MyColor ENUM$VALUES[];

    static {
        red = new TestEnumClass$MyColor("red", 0);
        green = new TestEnumClass$MyColor("green", 1);
        blue = new TestEnumClass$MyColor("blue", 2);
        ENUM$VALUES = (new TestEnumClass$MyColor[] {
            red, green, blue
        });
    }

    private TestEnumClass$MyColor(String s, int i) {
        super(s, i);
    }
}

從上面代碼來看,編譯器會將咱們定義的枚舉轉換成一個類,這個類繼承自 java.lang.Enum 類,此外,編譯器還會幫咱們生成多個枚舉類的實例,賦值給咱們定義的枚舉類型常量名(static靜態代碼塊裏),而且還聲明瞭一個枚舉對象的數組 ENUM$VALUES ,存放了全部的枚舉對象。諸多對象,對象數組,確實要比靜態變量佔據更多的內存。get

相關文章
相關標籤/搜索