我正在学习 Effective Java,并遇到了这个例子。
class Elvis implements Serializable {
public static final Elvis inst = new Elvis();
private Elvis() {
System.out.println("In elvis constructor ");
}
public static Elvis getInstance() {
return inst;
}
}
按照书上的说法,反序列化的时候应该构造一个新的ELVIS对象,但是我看到反序列化的时候没有调用构造函数?
这是我的序列化和反序列化代码。
FileOutputStream fos = new FileOutputStream("myserial1.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Elvis e = Elvis.getInstance();
System.out.println(" e = "+e.getInstance());
oos.writeObject(e);
System.out.println("Serialization done.");
FileInputStream fis = new FileInputStream("myserial1.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Elvis el = (Elvis) ois.readObject();
System.out.println(" el = "+el.getInstance());
我看到 e 和 e1 都引用了相同的引用,并且构造函数只被调用一次。
我是不是误解了这里的概念?
请帮忙。
最佳答案
在序列化过程中没有构造函数被调用,字段被反序列化过程或readObject()
method初始化(如果您将此方法添加到您的类(class)中)。如果你想实现一个可序列化的单例,你应该另外添加 readResolve()
方法,正如它描述的那样 here .
附言。
请记住,getInstance()
是类 Elvis
的静态方法,因此调用 e.getInstance()
和 el .getInstance()
等于 Elvis.getInstance()
。
关于java - 在java中反序列化一个单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21361137/