Топ-100Сериализация Singleton без утраты его сути - CodOrbits
LogoCodOrbits

Раздел: Сериализация

Узнайте, как сериализовать и десериализовать объекты в Java для сохранения состояния и передачи данных.

Все разделы
Иконка Сериализация

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

Last updated: 7 мая 2025 г.

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

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

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

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

1import java.io.*;
2
3//класс синглтон
4class Singleton implements Serializable {
5
6    public static Singleton instance = new Singleton();
7    //приватный конструктор нужен
8    //чтобы невозможно было создавать
9    //объект данного класса вне класса Singleton.
10    //то есть выше мы создали один объект
11    //и больше ни одного создаваться не будет
12    private Singleton() {
13    }
14
15    // private constructor
16
17    //Все что нужно сделать это определить
18    //в классе синглтона метод с именем readResolve
19    //вот так как ниже и сериализоваться
20    //в итоге будет тот же объект синглтона
21    protected Object readResolve() {
22        return instance; } //возвращает этот же объект
23}
24
25public class SingletonSer {
26
27    public static void main(String[] args) {
28
29        try {
30            //снизу обычная сериализация.
31            //как в прошлых уроках
32            Singleton instance1 = Singleton.instance;
33            ObjectOutput out = new ObjectOutputStream(
34                new FileOutputStream("file.text"));
35
36            out.writeObject(instance1);
37            out.close();
38
39            ObjectInput in = new ObjectInputStream(
40                new FileInputStream("file.text"));
41            Singleton instance2
42                = (Singleton) in.readObject();
43            in.close();
44
45            //теперь instance1 и instance2 возвращают один
46            //и тот же hashCode что значит
47            //что это один и тот же экземпляр
48            System.out.println("instance1 hashCode:- "
49                + instance1.hashCode());
50            System.out.println("instance2 hashCode:- "
51                + instance2.hashCode());
52        }
53
54        catch (Exception e) {
55            e.printStackTrace();
56        }
57    }
58}

Вывод:

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


Следующие уроки

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

10
мин.

Similar Articles Icon
Divider

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

13
мин.

Similar Articles Icon
Divider

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

14
мин.

Similar Articles Icon