вторник, 22 апреля 2008 г.

Java Puzzle 83: Dyslexic Monotheism

Однажды один мужик режил что он единственный такой исключительный пёс. И тогда он написал класс, думая что написал 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";
}
}

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

Комментариев нет:

Отправить комментарий