java基础-枚举序列化

枚举编译

  • 创建一个类: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 extends Enum<T>> T valueOf(Class<T> enumType,  
                                                String name) {  
        T result = enumType.enumConstantDirectory().get(name);  
        if (result != null)  
            return result;  
        if (name == null)  
            throw new NullPointerException("Name is null");  
        throw new IllegalArgumentException(  
            "No enum const " + enumType +"." + name);  
    }  
private volatile transient Map<String, T> enumConstantDirectory = null;
  Map<String, T> enumConstantDirectory() {
        if (enumConstantDirectory == null) {
            T[] universe = getEnumConstantsShared();
            if (universe == null)
                throw new IllegalArgumentException(
                    getName() + " is not an enum type");
            Map<String, T> m = new HashMap<>(2 * universe.length);
            for (T constant : universe)
                m.put(((Enum<?>)constant).name(), constant);
            enumConstantDirectory = m;
        }
        return enumConstantDirectory;
    }

枚举的组织:
1.接口
2.枚举的枚举
3.枚举嵌套枚举

public enum Meal {
    APPTIZER(Food.Appetizer.class), MAINCOURSE(Food.MainCourse.class);
    public interface Food {
        enum Appetizer implements Food {
            SALAD, SOUP;
        }
        enum MainCourse implements Food {
            Dumpling, Noodles;
        }
    }

    private Food[] values;

    private Meal(Class<? extends Food> kind) {
        values = kind.getEnumConstants();
    }

    void show() {
        for (Food value : values) {
            System.out.println(value);
        }
    }

    public static void main(String[] args) {
        System.out.println(Meal.APPTIZER.name());
    }
}
posted @ 2016-08-09 13:21  zhangshihai1232  阅读(4422)  评论(0编辑  收藏  举报