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