我重写了readobject和writeobject,但是还是不能保证单例。
package com.citi.designpattern.singleton; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class SingletonTest1 implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private SingletonTest1(){ } private static SingletonTest1 getInstance(){ return Nested.instance; } static class Nested{ private static SingletonTest1 instance = new SingletonTest1(); } public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException{ //1. for not Serizable /*SingletonTest1 instance1 = SingletonTest1.getInstance(); SingletonTest1 instance2 = SingletonTest1.getInstance(); System.out.println(instance1 == instance2);*/ //2. for Serizable /*SingletonTest1 instance = SingletonTest1.getInstance(); File file = new File("ser.out"); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); oos.writeObject(instance); oos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); SingletonTest1 oIstance = (SingletonTest1)ois.readObject(); ois.close(); System.out.println(oIstance == instance); */ //3. overwrite writeObject and readObject //SingletonTest1 instance = SingletonTest1.getInstance(); File file = new File("ser.out"); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); new SingletonTest1().writeObject(oos); oos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); System.out.println(new SingletonTest1().readObject(ois) == SingletonTest1.getInstance()); ois.close(); } private void writeObject(ObjectOutputStream oos) throws IOException { //oos.defaultWriteObject(); oos.writeObject(SingletonTest1.getInstance()); } private SingletonTest1 readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { //ois.defaultReadObject(); return (SingletonTest1)ois.readObject(); } }
结果是false。
我重写的这俩方法应该有问题,求助。谢谢。
当然是false了。对象写的读只是copy了一个内容是一样的对象。它们的内存地址还是不同的。如果你想让一个对象内容相同,就相等的话,要覆盖hashcode ,equal方法什么的,具体的我不记得了。
个人觉得这不需要重写hashcode和equals,但是前面的我同意。找了一代替方案,重写readReslove
百度 == 和equal 的区别。
这跟==和equals有什么关系。。个么你觉得我得重写下equals和hashcode?
@Ruth/Christy: ==操作符会去调用equals方法,默认的equals方法会比较内存地址(或者说引用),如果你想改变规则为内容相同就是相等,那就要覆盖原来的方法, 看你的实际需求了。
@angelshelter: 我的需求是实现序列话,然后单例。==来自两方面equals和hashcode方法,介个我知道。
@Ruth/Christy: 你不会是想序列化出来对象,都是同一个对象吧?