Сериализация Singleton без утраты его сути

Cинглтон это класс, который может иметь только один экземпляр. То есть другой экземпляр этого класса невозможно создать.

Если мы сериализуем этот экземпляр, а потом десериализуем, то получим уже второй экземпляр синглтона, что противоречит идее синглтона.

Чтобы десериализовался тот же экземпляр нужно определить метод readResolve.

Пример программы:

import java.io.*; //класс синглтон class Singleton implements Serializable { public static Singleton instance = new Singleton(); //приватный конструктор нужен //чтобы невозможно было создавать //объект данного класса вне класса Singleton. //то есть выше мы создали один объект //и больше ни одного создаваться не будет private Singleton() { } // private constructor //Все что нужно сделать это определить //в классе синглтона метод с именем readResolve //вот так как ниже и сериализоваться //в итоге будет тот же объект синглтона protected Object readResolve() { return instance; } //возвращает этот же объект } public class SingletonSer { public static void main(String[] args) { try { //снизу обычная сериализация. //как в прошлых уроках Singleton instance1 = Singleton.instance; ObjectOutput out = new ObjectOutputStream( new FileOutputStream(“file.text”)); out.writeObject(instance1); out.close(); ObjectInput in = new ObjectInputStream( new FileInputStream(“file.text”)); Singleton instance2 = (Singleton) in.readObject(); in.close(); //теперь instance1 и instance2 возвращают один //и тот же hashCode что значит //что это один и тот же экземпляр System.out.println(“instance1 hashCode:- ” + instance1.hashCode()); System.out.println(“instance2 hashCode:- ” + instance2.hashCode()); } catch (Exception e) { e.printStackTrace(); } } }

Вывод:

Как видим, instance1 и instance2 возвращают один и тот же hashCode, что значит, что это один и тот же экземпляр, что значит, что концепция синглтона не нарушается.

Управляемая сериализация в Java: Externalizable

Как сериализовать объекты с классами, не реализующими Serializable. Используем Externalizable для ручного управления процессом в Java.
Time to read: 10

Базы данных: основные принципы

Основы реляционных баз данных: таблицы, атрибуты и кортежи. Как хранить данные эффективно и избегать избыточности. Пример таблиц.
Time to read: 13

Связь Один-ко-Многим в базах данных

Узнайте, как правильно организовать связь один-ко-многим в реляционных базах данных. Примеры таблиц, устранение дублирования данных.
Time to read: 14