Java 枚举类型原理简要分析

人盡茶涼 提交于 2019-12-28 01:52:09

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

问题:枚举是一种特殊的数据类型,一般用来列举有限个、同类型的常量。它能保证参数的安全性,如方法声明传入的参数,必须是指定枚举中的常量。但使用枚举会比使用静态变量多消耗更多的内存,那为什么枚举这么耗内存?

先看下这段代码:

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 这个枚举类型:

public enum MyColor {red, green, blue};

1、找到此枚举类的 .class 字节码文件

2、使用 jad 反编译 TestEnumClass$MyColor.class 文件,生成 TestEnumClass$MyColor.jad 文件

jad 的下载地址:点击下载

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 ,存放了所有的枚举对象。诸多对象,对象数组,确实要比静态变量占据更多的内存。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!