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

public enum MyColor {red, green, blue};

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

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

a23411d70eddda2c66aa2b254fc3a0ad.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值