Я проходил эффективную Java и наткнулся на этот пример.Deserializing a singleton in 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;
}
}
Согласно книге, когда я десериализации, новый объект ЭЛВИС должен быть построен, но я вижу, что конструктор не вызывается во время десериализации?
Вот мой код, который сериализуется и десериализуется.
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());
I Вид и e и e1 присваивают одну и ту же ссылку, а конструктор вызывается только один раз.
Я не понимаю концепцию здесь?
Пожалуйста, помогите.
Deserialization подразумевает, что вы можете делать это более одного раза, и это нарушает концепцию одноэлементного. Дело не в том, что вы не можете этого сделать, но что бы вы ни делали, это будет взлом. –
JBoss Smart клонирование, похоже, повторно использует конечные поля, может быть, это лучший вариант для вас? http://www.jboss.org/serialization – KIC