java 序列化 枚举_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 valueOf(Class 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 enumConstantDirectory = null;

Map enumConstantDirectory() {

if (enumConstantDirectory == null) {

T[] universe = getEnumConstantsShared();

if (universe == null)

throw new IllegalArgumentException(

getName() + " is not an enum type");

Map 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());

}

}


版权声明:本文为weixin_39622568原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。