Однажды один мужик режил что он единственный такой исключительный пёс. И тогда он написал класс, думая что написал singleton:
public class Dog extends Exception {
public static final Dog INSTANCE = new Dog();
private Dog() {
}
public String toString() {
return "Woof";
}
}
Но он ошибался. Во всём. Сможете ли вы создать второй экземпляр класса
Dog
не используя reflection?
Ну тут надо сообразить, что класс
Exception
является
Serializable
. А дальше всё просто. Эта проблема и её решение были описаны в книге Effective Java: singleton, который имплементирует интерфейс
Serializable
должен определять
readResolve
метод, который возвращает единственный экземпляр:
public class Dog extends Exception {
public static final Dog INSTANCE = new Dog();
private Dog() {
}
private Object readResolve() {
return INSTANCE;
}
public String toString() {
return "Woof";
}
}
А иначе при десериализации вы получите другой экземпляр.