Ответ 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
, потому что перечисления имеют код сериализации/десериализации для сохранения природы "фиксированного набора значений". Вы также можете написать этот код для одноэлементного класса, но это проще не делать.