枚举编译
创建一个类:FruitEnum继承自java.lang.Enum
定义的枚举被声明为public static final类型常量
FruitEnum$VALUES数组,保存常量APPLE和ORANGE
创建两个对象,常量引用这个两个对象
两个静态方法:
values()拷贝一份数组
valueOf(String),调用java.lang.Enum中的valueOf
注意:这里的valueOf(String)只有一个参数
总结:每一个枚举类型极其定义的枚举变量在JVM中都是唯一的,(类型不可继承,构造方法私有,编译器构造,不支持clone)
序列化
枚举常量和其他对象序列化不同,序列化的枚举类型,只包含name,而filed值不在序列化文件里。
序列化时,ObjectOutputStream写入name方法返回的值(就是字符串)。
反序列化时,ObjectInputStream从流中读取name值,然后通过java.lang.Enum.valueOf方法获取这个枚举常量。编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法。
public static > T valueOf(Class enumType,
String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result !=