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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容