在ToStringBuilder学习(一)中提到一个问题,即 readResolve方法是干啥的? 当时也没多想, 只是列在那里, 今天忙里偷闲地把搜点材料整理下这个问题.
原来这个方法跟对象的序列化相关(这样倒是解释了为什么 readResolve方法是private修饰的). ??? 怎么跟对象的序列化相关了?

下面我们先简要地回顾下对象的序列化. 一般来说, 一个类实现了 Serializable接口, 我们就可以把它往内存地写再从内存里读出而"组装"成一个跟原来一模一样的对象. 不过当序列化遇到单例时,这里边就有了个问题: 从内存读出而组装的对象破坏了单例的规则. 单例是要求一个JVM中只有一个类对象的, 而现在通过反序列化,一个新的对象克隆了出来.
如下例所示:
public final class MySingleton implements Serializable {
     private MySingleton() { }
     private static final MySingleton INSTANCE = new MySingleton();
     public static MySingleton getInstance() { return INSTANCE; }
}

当把 MySingleton对象(通过getInstance方法获得的那个单例对象)序列化后再从内存中读出时, 就有一个全新但跟原来一样的MySingleton对象存在了. 那怎么来维护单例模式呢?这就要用到readResolve方法了. 如下所示:
public final class MySingleton implements Serializable{
    private MySingleton() { }
    private static final MySingleton INSTANCE = new MySingleton();
    public static MySingleton getInstance() { return INSTANCE; }
    private Object readResolve() throws ObjectStreamException {
       // instead of the object we're on,
       // return the class variable INSTANCE
      return INSTANCE;
   }
}

这样当JVM从内存中反序列化地"组装"一个新对象时,就会自动调用这个 readResolve方法来返回我们指定好的对象了, 单例规则也就得到了保证.
---------------------------------
上面用的例子来源于这个链接:http://www.javalobby.org/java/forums/t17491.html, 另这个链接中还有一个更为高级的例子, 如有兴趣可去一看.

博客元地址:http://rmn190.iteye.com/blog/350193

转载于:https://www.cnblogs.com/kabi/p/5182837.html

ToStringBuilder学习(三):readResolve()方法与序列化相关推荐

  1. ReadResolve方法与序列化

    使用枚举实现的单例模式,不但可以防止利用反射强行构建单例对象,而且可以在枚举类对象被反序列化的时候,保证反序列的返回结果是同一对象. 对于其他方式实现的单例模式,如果既想要做到可序列化,又想要反序列化 ...

  2. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  3. (转)MyBatis框架的学习(三)——Dao层开发方法

    http://blog.csdn.net/yerenyuan_pku/article/details/71700957 使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mappe ...

  4. 21天学习之二(Android 10.0 SystemUI默认去掉底部导航栏的三种方法)

    活动地址:CSDN21天学习挑战赛 1.概述 在定制化开发中,在SystemUI的一些定制功能中,针对默认去掉底部导航栏的方法有好几种,StatusBar和DisplayPolicy.java中api ...

  5. java数据输入的步骤_Java学习日志1.4 Scanner 数据输入的三种方法

    Scanner sc = new Scanner(System.in); /注意in 是InputStream的缩写,是字节输入流的意思. 整句话的含义就是: new 一个对象,接受从键盘输入的数据, ...

  6. python学习音频-详解python播放音频的三种方法

    第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load(self.wav_file) pygame.mixer.music.set_vol ...

  7. python描述符魔术方法_学习笔记-Python基础9-面向对象编程OOP-类的成员描述符(property)、类的常用内置属性、类的常用魔术方法、类和对象的三种方法...

    一.类的成员描述符(property) 类的成员描述符是为了在类中,对类的成员属性进行相关操作而创建的一种方式,大部分属于数据清洗 属性有三种操作:get获取属性值.set修改或添加属性.delete ...

  8. EIGRP区域注入静态路由的三种方法--CCNP学习笔记

    EIGRP区域注入静态路由的三种方法 拓扑图 R2为外网,R1为边界路由器.R3,R4为内部路由器 基本配置 R2配置: R2#sh run Building configuration... Cur ...

  9. php+数组存放文件名_php将数组存储为文本文件的三种方法

    本篇文章主要介绍php将数组存储为文本文件的三种方法,感兴趣的朋友参考下,希望对大家有所帮助. (1)利用serialize 将数组序列化存储为文本文件,调用时候再使用unserialize 还原&l ...

最新文章

  1. LTE - PRACH 时频资源介绍
  2. CentOS虚拟机和物理机共享文件夹实现
  3. shell python优势_python的优势
  4. AngularJs学习笔记--expression
  5. 网络工程师成长日记417-西安如家酒店无线覆盖技术支持
  6. html5+、ReactNative、Weex、Ionic之间的区别、(配置java、python、Android环境)、ReactNative(react-native-cli)、yarn、Weex
  7. 新电脑怎么分盘_【磁盘分区教程】如何给电脑进行分区?
  8. [server]阿里云服务器远程文件传输的解决方案
  9. 《Pro SQL Server Internals, 2nd edition》的CHAPTER 2 Tables and Indexes中的Clustered Indexes一节...
  10. c语言计算燃烧温度,f与c温度换算(温度f和c换算计算器)
  11. 图像直方图及其均衡化--opencv
  12. FFmpeg —— 14.示例程序(八):音频编码器(PCM编码为AAC)
  13. 38岁超任模拟器设计者自杀!死前留下真名与神秘自拍照,最后一刻开源higan
  14. 【练习/Python】监测汇率脚本
  15. 优漫动游平面设计思维思维训练法
  16. 【项目管理】项目进度管理
  17. Android Studio使用真机(连接安卓手机驱动)调试教程
  18. 365技术网址导航源码附加交易系统
  19. unity 调用大华设备视频
  20. 基于JAVA电影院售票系统设计与实现 开题报告

热门文章

  1. 为什么 wait/notify/notifyAll 在 Object 类定义而不是 Thread 类?
  2. 9个用于构建容错系统的开源工具
  3. 北大 AI 公开课 2019 | 颜水成:人工智能行业观察与实践
  4. centos(linux) 下如何查看端口占用情况及杀死进程
  5. 川大优秀毕业生在GitHub上建了一个项目《深度学习500问》,还未完结就获赞无数
  6. java ReentrantLock 实现原理
  7. 网络:TCP停止等待、超时重传、滑动窗口、拥塞控制、快重传和快恢复
  8. 多线程:并发实现方法之J.U.C
  9. 如何发布php网站_php网站如何发布【货币问答】- 联合货币
  10. 路由表及路由的选择算法