java基础-枚举序列化
枚举编译
创建⼀个类:FruitEnum继承⾃java.lang.Enum
定义的枚举被声明为public static final类型常量
FruitEnum$VALUES数组,保存常量APPLE和ORANGE
创建两个对象,常量引⽤这个两个对象
两个静态⽅法:
values()拷贝⼀份数组
java valueofvalueOf(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 = umConstantDirectory().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 = EnumConstants();
}
void show() {
for (Food value : values) {
System.out.println(value);
}
}
public static void main(String[] args) {
System.out.println(Meal.APPTIZER.name()); }
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论