ToStringBuilder学习(三):readResolve()方法与序列化
在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
ToStringBuilder学习(三):readResolve()方法与序列化的更多相关文章
- ReadResolve方法与序列化
		
使用枚举实现的单例模式,不但可以防止利用反射强行构建单例对象,而且可以在枚举类对象被反序列化的时候,保证反序列的返回结果是同一对象. 对于其他方式实现的单例模式,如果既想要做到可序列化,又想要反序列化 ...
 - Java序列化之readObjectNoData、readResolve方法
		
Java序列化之readObjectNoData.readResolve方法 学习了:http://vyloy.iteye.com/blog/1240663 readResolve方法会在Object ...
 - Android学习笔记之dispatchTouchEvent和OnInterceptTouchEvent和OnTouchEvent三个方法之间的联系...
		
PS:好久没有写博客了,项目正式开始启动了,但是怎么也打不起精神来...可能还是不适应放假留校...这下一年只能回家一次了...伤感...写篇博客舒坦下... 学习内容: Android中disp ...
 - (转)MyBatis框架的学习(三)——Dao层开发方法
		
http://blog.csdn.net/yerenyuan_pku/article/details/71700957 使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mappe ...
 - MD5三种方法的学习总结
		
MD5百度百科 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已 ...
 - (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待
		
selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...
 - mac学习Python第一天:安装、软件说明、运行python的三种方法
		
一.Python安装 从Python官网下载Python 3.x的安装程序,下载后双击运行并安装即可: Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的. MAC 系统一般 ...
 - (三)jdk8学习心得之方法引用
		
三.方法引用 https://www.jianshu.com/p/c9790ba76cee 这边博客写的很好,可以首先阅读,在这里感谢这篇文章的博主. 1. 格式 调用者::调用者具备的方法名 2. ...
 - TypeScript学习笔记(三) - 方法
		
本篇将介绍在TypeScript里如何定义和使用方法. 一.方法标准声明和使用 // 方法声明 function func(x: number, y: number): number { return ...
 
随机推荐
- 【java】实体类中  Set<对象> 按照对象的某个字段对set排序
			
背景: User实体类 有个属性是 Set<PositionChange> 职位变更字段 如下: PositionChange实体类 有个属性是positionStartDate 什 ...
 - JSP和Servlet中的几个编码的作用及原理
			
首先,说说JSP和Servlet中的几个编码的作用. 在JSP和Servlet中主要有以下几个地方可以设置编码,pageEncoding="UTF-8".contentType=& ...
 - Tile based Rendering //后面一段是手机优化建议
			
https://www.imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/ 一种硬件结构 ...
 - form表单提交时选择性传值到后台
			
正常情况下form表单提交会把表单内的内容提交到后台,但是如果有些内容只是作为展示或者是标记而不想传到后台,我们采用如下方法: jsp页面如下,我们不想提交id为userIdMark和pwdMark的 ...
 - mysql 比较隐秘的问题
			
2017-11-13 13:47:27:DEBUG DubboServerHandler-192.168.30.114:20990-thread-5 com.yryz.qshop.modules.in ...
 - CocoSourcesCS 3
			
CocoSourcesCS 3 /*---------------------------------------------------------------------- Compiler Ge ...
 - 【ACM】Largest prime factor
			
/*打表把素数能组合的数先设置成相应的位数*/ /* if n equals two and n is No.1 position of prime factors so four position ...
 - Js和html相结合的方式
			
目录 TOC \o "1-3" \h \z \u js和html相结合的方式. PAGEREF _Toc455386178 \h 1 08D0C9EA79F9BACE118C82 ...
 - Odoo,OpenERP widget标签
			
Odoo,OpenERP widget标签 widget="statusbar" 头部状态条标签 widget="email" 电子邮件地址标签 widget ...
 - [Exception Android 20] - Error:Execution failed for task ':app:processDebugResources'
			
Error:Execution failed for task ':app:processDebugResources'. > com.android.ide.common.process.Pr ...