下面程序为Singleton类提供了readResolve()方法,当JVM反序列化地恢复一个新对象时,系统会自动调用这个readResolve()方法返回指定好的对象,从而保证系统通过反序列化机制不会产生多个对象。运行下面程序,程序判断singleton == singleton2 是否相同将输出true,这表明反序列化机制恢复出来的Java对象依然是原来的Java对象。通过这种方式可保证反序列化时Singleton依然是单例类。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;
class Singleton implements Serializable {
private static final long serialVersionUID = 327838450350496302L;
private static Singleton instance;
private String name;
private Singleton(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Singleton getInstance(String name) {
if (instance == null) {
instance = new Singleton(name);
}
return instance;
}
// 提供readResolve()方法
private Object readResolve() throws ObjectStreamException {
return instance;
}
}
public class SingletonTest {
public static void main(String[] args) throws Exception {
// 调用静态方法来获取wolf实例
Singleton singleton = Singleton.getInstance("NorhtWolf");
System.out.println("Wolf对象创建完成~~~");
Singleton singleton2 = null;
ObjectOutputStream objectOutputStream = null;
ObjectInputStream objectInputStream = null;
try {
// 创建对象输出流
objectOutputStream = new ObjectOutputStream(new FileOutputStream(
"b.bin"));
// 创建对象输入流
objectInputStream = new ObjectInputStream(new FileInputStream(
"b.bin"));
// 序列化输入Java对象
objectOutputStream.writeObject(singleton);
objectOutputStream.flush();
// 反序列化恢复Java对象
singleton2 = (Singleton) objectInputStream.readObject();
System.out.println(singleton2.getName());
// 两个对象的实例变量值完全相等
System.out.println(singleton.equals(singleton2));
// 两个对象不相同
System.out.println(singleton == singleton2);
} catch (Exception e) {
} finally {
if (objectOutputStream != null) {
objectOutputStream.close();
}
if (objectInputStream != null) {
objectInputStream.close();
}
}
}
}