《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.4.4 序列化单例和类型安全的枚举

简介: 本节书摘来华章计算机《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一书中的第2章 ,第2.4.4节,[美] 凯S.霍斯特曼(Cay S. Horstmann) 著陈昊鹏 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4.4 序列化单例和类型安全的枚举

在序列化和反序列化时,如果目标对象是唯一的,那么你必须加倍当心,这通常会在实现单例和类型安全的枚举时发生。
如果你使用Java语言的enum结构,那么你就不必担心序列化,它能够正常工作。但是,假设你在维护遗留代码,其中包含下面这样的枚举类型:
image
image

这种风格在枚举被添加到Java语言中之前是很普遍的。注意,其构造器是私有的。因此,不可能创建出超出Orientation.HORIZONTAL和Orientation.VERTICAL之外的对象。特别是,你可以使用==操作符来测试对象的等同性:

当类型安全的枚举实现Serializable接口时,你必须牢记存在着一种重要的变化,此时,默认的序列化机制是不适用的。假设我们写出一个Orientation类型的值,并再次将其读回:

image

将失败。事实上,saved的值是Orientation类型的一个全新的对象,它与任何预定义的常量都不等同。即使构造器是私有的,序列化机制也可以创建新的对象!
为了解决这个问题,你需要定义另外一种称为readResolve的特殊序列化方法。如果定义了readResolve方法,在对象被序列化之后就会调用它。它必须返回一个对象,而该对象之后会成为readObject的返回值。在上面的情况中,readResolve方法将检查value域并返回恰当的枚举常量:
image

请记住向遗留代码中所有类型安全的枚举以及向所有支持单例设计模式的类中添加readResolve方法。

相关文章
|
21天前
|
存储 安全 Java
解密 Java 枚举的奥秘:超越常量的选择
解密 Java 枚举的奥秘:超越常量的选择
25 0
|
1月前
|
开发框架 Java API
最新Java基础系列课程--Day13-高级特性(二)
最新Java基础系列课程--Day13-高级特性
|
1月前
|
存储 算法 Java
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
|
3天前
|
存储 安全 算法
Java泛型与集合:类型安全的集合操作实践
Java泛型与集合:类型安全的集合操作实践
|
4天前
|
存储 Java 数据库连接
详解Java中ThreadLocal类型
详解Java中ThreadLocal类型
18 1
|
5天前
|
Java
Java枚举简述
Java枚举简述
10 0
|
9天前
|
Java
百度搜索:蓝易云【Java中如何向一个string类型的数组中添加数据】
在上述代码中,我们首先创建一个新的String数组 `newArray`,长度为原数组 `originalArray`的长度加1。然后,通过循环将原数组中的元素复制到新数组中。最后,将新数据 `newData`添加到新数组的末尾。现在,`newArray`就包含了原数组的所有元素,并且在末尾添加了新的数据。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
8 0
|
20天前
|
Java 数据安全/隐私保护
6-4 字符串加密(Java解法,两种网上的类型题)
6-4 字符串加密(Java解法,两种网上的类型题)
15 0
|
20天前
|
Java
java字符串练习题4、统计一行字符串中所有的字符类型数量
java字符串练习题4、统计一行字符串中所有的字符类型数量
19 0
|
21天前
|
安全 Java 测试技术
解密Java并发中的秘密武器:LongAdder与Atomic类型
解密Java并发中的秘密武器:LongAdder与Atomic类型
29 1