【推荐】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 ,存放了所有的枚举对象。诸多对象,对象数组,确实要比静态变量占据更多的内存。
来源:oschina
链接:https://my.oschina.net/u/3637389/blog/3148892