Допустим, у нас есть следующий одноэлементный класс:
public class ConnectionFactory implements Serializable {
private static ConnectionFactory INSTANCE;
private ConnectionFactory() { }
public static ConnectionFactory getInstance() {
if (INSTANCE == null) {
synchronized(ConnectionFactory.class) {
if(INSTANCE == null)
INSTANCE = new ConnectionFactory();
}
}
return INSTANCE;
}
}
Теперь у нас есть основной класс, как показано ниже для сериализации и десериализации объектов:
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
ConnectionFactory INSTANCE=ConnectionFactory.getInstance();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("connFactory.ser"));
oos.writeObject(INSTANCE);
oos.close();
// Here I am recreating the instance by reading the serialized object data store
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("connFactory.ser"));
ConnectionFactory factory1 = (ConnectionFactory) ois.readObject();
ois.close();
// I am recreating the instance AGAIN by reading the serialized object data store
ObjectInputStream ois2 = new ObjectInputStream(new FileInputStream("connFactory.ser"));
ConnectionFactory factory2 = (ConnectionFactory) ois2.readObject();
ois2.close();
// Let's see how we have broken the singleton behavior
System.out.println("Instance reference check->" +factory1.getInstance());
System.out.println("Instance reference check->" +factory2.getInstance());
System.out.println("=========================================================");
System.out.println("Object reference check->" + factory1);
System.out.println("Object reference check->" + factory2);
}
Так что, если мы выполним приведенный выше кодмы получим следующее поведение: "он создал два объекта и одну статическую ссылку для INSTANCE. Это означает, что если мы прочитаем сериализованный формат одноэлементного объекта несколько раз, мы создадим несколько объектов. Это не то, что одноэлементный объектдолжен делать. Поэтому можем ли мы избежать i ?, Да, мы можем. "
Чтобы избежать нескольких экземпляров одноэлементного класса, мы будем использовать следующий метод, предоставляемый сериализацией:
private Object readResolve() throws ObjectStreamException {
return INSTANCE;
}
Это предотвратит создание нескольких экземпляров одноэлементного класса.