Работа с синглтонами, которые должны подкласса
В вопросе Что представляет собой эффективный способ реализации одноэлементного шаблона в Java? ответ с наибольшим количеством опросов говорит о том, чтобы использовать Enum для реализации singleton.
Это прекрасно, и я понимаю аргументы, соответственно, преимущества языка.
Я имею, однако, набор классов, которые я определяю singleton, но которые должны распространять другие классы, это невозможно с подходом enum, , поскольку перечисления не могут подклассы.
Джошуа Блох говорит в своих слайдах:
- Но одна вещь отсутствует - вы не можете расширить тип перечисления
- В большинстве случаев вы не должны
- Один убедительный код использования case-operation
В большинстве случаев вам не следует: может кто-то уточнить, что? Я выполнил несколько сервлетов, и они расширяют HttpServlet
, почему они не должны быть одиночными? Мне нужно только один экземпляр из них в моем приложении.
Ответы
Ответ 1
Класс Singleton может распространять другие классы; фактически по умолчанию в Java он все равно будет расширять Object. Однако то, что говорит Джош, заключается в том, что вы не должны распространять класс Singleton, потому что, как только вы его расширяете, присутствует более одного экземпляра.
Отвечая на комментарий:
На самом деле лучшим способом реализации Singleton является:
Из эффективной Java
// Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}
Здесь Элвис может расширять любой другой класс.
Ответ 2
Вы не должны заботиться о фактическом экземпляре ваших сервлетов - управление жизненным циклом обрабатывается контейнером сервлета в соответствии с контрактом спецификации сервлета, на который вы согласились. Если имеет смысл реализовывать части вашей серверной функциональности в качестве одноэлементного, то вперед и делайте это так, как вам нравится, и используйте его из своего сервлета.
Ответ 3
Josh ссылается на расширение типа перечисления, а не на то, что одноэлементный тип расширяет что-то еще.