Подтвердить что ты не робот

INSTANCE в Java Enum

Хорошая практика определения INSTANCE в Enum для бесплатной сериализации (эффективная версия Java 2, пункт 3). Если кто-то может объяснить немного больше, что это значит, это будет здорово.

Каков наилучший подход для использования Enum в качестве одноэлементного решения на Java?

спасибо заранее, Lin

4b9b3361

Ответ 1

Здесь демонстрация:

import java.io.*;

class ClassSingleton implements Serializable {
    public static final ClassSingleton INSTANCE = new ClassSingleton();

    private ClassSingleton() {}
}

enum EnumSingleton {
    INSTANCE;
}

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        byte[] data;
        try (ByteArrayOutputStream output = new ByteArrayOutputStream();
             ObjectOutputStream oos = new ObjectOutputStream(output)) {
            oos.writeObject(ClassSingleton.INSTANCE);
            oos.writeObject(EnumSingleton.INSTANCE);
            data = output.toByteArray();
        }

        try (ByteArrayInputStream input = new ByteArrayInputStream(data);
             ObjectInputStream ois = new ObjectInputStream(input)) {
            ClassSingleton first = (ClassSingleton) ois.readObject();
            EnumSingleton second = (EnumSingleton) ois.readObject();

            System.out.println(first == ClassSingleton.INSTANCE);
            System.out.println(second == EnumSingleton.INSTANCE);
        }
    }
}

Здесь мы имеем как "простой" одноуровневый класс, так и версию на основе enum.

Мы выписываем оба экземпляра в ObjectOutputStream, а затем читаем их снова. Вывод false, затем true, показывая, что с одноэлементным классом мы получили два экземпляра ClassSingleton... наш "нормальный", а тот, который создан десериализацией. Однако у нас есть только один экземпляр EnumSingleton, потому что перечисления имеют код сериализации/десериализации для сохранения природы "фиксированного набора значений". Вы также можете написать этот код для одноэлементного класса, но это проще не делать.