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

相关文章
相关标签/搜索