怎么让一个单列类能够变成多例的类
2012-03-23 17:22
330 查看
我们知道一个单例类正常情况下只可以产生一个实例,为了能够达到将单例类转换成多例类(这里纯粹为了实现而实现没有必要)
我们可以让单例类实现Serializable接口,进行序列化
然后反序列化,在进行反序列时,由于单例类实现了序列化接口,因此会自动创建新的类,到达多例的效果
如果任然想在 单例类实现了序列化接口的情况下 依旧产生单例类 可以在单例类中加入readResolve()方法
为什么反序列化会产生新的对象了
因此Worm readWorm = (Worm) in.readObject();反序列化的时候,只是简单的恢复数据来创建对象,并没有去调用任何的构造器,
也就无法判断改对象实例是否已经存在了,所以反序列化出来的都是 新的对象
我们可以让单例类实现Serializable接口,进行序列化
然后反序列化,在进行反序列时,由于单例类实现了序列化接口,因此会自动创建新的类,到达多例的效果
如果任然想在 单例类实现了序列化接口的情况下 依旧产生单例类 可以在单例类中加入readResolve()方法
package com.java.single; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamException; import java.io.Serializable; /** * 我们知道一个单例类正常情况下只可以产生一个实例,为了能够达到将单例类转换成多例类(这里纯粹为了实现而实现没有必要) * 我们可以让单例类实现Serializable接口,进行序列化 * 然后反序列化,在进行反序列时,由于单例类实现了序列化接口,因此会自动创建新的类,到达多例的效果 * 如果任然想在 单例类实现了序列化接口的情况下 依旧产生单例类 可以在单例类中加入readResolve()方法 */ public class Data { //序列化 public static void writeObject() throws Exception{ Worm worm = Worm.getInstance(); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("d://worm.out")); out.writeObject(worm); out.close();//关闭的同时也刷新清空了缓冲区 } //反序列化 public static Worm readObject() throws Exception{ ObjectInputStream in = new ObjectInputStream(new FileInputStream("d://worm.out")); Worm readWorm = (Worm) in.readObject(); return readWorm; } public static void main(String[] args) throws Exception{ // writeObject(); Worm worm1 = readObject(); Worm worm2 = readObject(); System.out.println(worm1 == worm2); } } class Worm implements Serializable{ private static final long serialVersionUID = 1L; private static Worm instance = new Worm();//私有的实例成员,在类加载的时候就创建好了单例对象 private Worm() {//私有构造方法,避免外部创建实例 } public static Worm getInstance(){//仅此有一个公开的静态方法,得到一个实例 return instance;//返回实例 } /** * 如果采用了单例的类实现了序列化接口后,在进行反序列时,会自动创建新的类, * 为了解决这个问题,可以采用readResolve()方法 */ // private Object readResolve() throws ObjectStreamException { // return instance; // } }
为什么反序列化会产生新的对象了
因此Worm readWorm = (Worm) in.readObject();反序列化的时候,只是简单的恢复数据来创建对象,并没有去调用任何的构造器,
也就无法判断改对象实例是否已经存在了,所以反序列化出来的都是 新的对象
相关文章推荐
- 内存卡的相片变成一个USBC文件怎么办?
- 怎么快速 把一个 监听事件 变成 一个 内部类 在编程一个新的 java文件
- 判断一个字符串是否能够通过添加一个字符变成回文序列的方法
- python 中4个字节怎么变成一个浮点数
- xp系统安装后变成一个盘了别的盘的文件怎么找到
- 一个WINFORM上面有两个DataGrid,当选中其中一个的时候,怎么让另一个CurrentRowIndex变成空?
- 如何能够变成一个“会说话的人”
- 创建一个小球,3秒后变成两个,再过3秒变成4个,再过3秒变成8个,只可以写一个脚本,该怎么编写?
- Eclipse中光标变成一个黑色的长方形了怎么办?
- 克里1971年的反战演讲:“你怎么能够要求最后一个人为一个错误的政策去死?”
- 集合怎么能转化成单个对象呢!只能从集合中取一个变成单个的对象!
- 怎么能够认清一个开源组件的功能
- 怎样才能把一个代码变成软件成品?一个初学者的困惑,我们写的代码都只能是解决一些数学问题而已。怎么把它变成一个软件。
- 创建一个Storyboard工程 storyboard是在ios5中引入的新控件,能够更加清晰、简单的整合多个ViewController的关系,下面主要介绍一下怎么初建一个storyboard的工程
- 用js怎么实现把一个链接变成二维码?
- 看看一个好男孩怎么变成一个坏男人!!!!!!
- 主目录不小被清空了,桌面目录与主目录变成同一个目录怎么办
- javascript怎么做出一个加号点击之后变成一个减号而且隐身了内容
- 实际工作中怎么判断一个程序或模块是否能够工作
- 一主一从的结构,怎么最小影响添加一个从库,变成一主两从