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

Работа с синглтонами, которые должны подкласса

В вопросе Что представляет собой эффективный способ реализации одноэлементного шаблона в Java? ответ с наибольшим количеством опросов говорит о том, чтобы использовать Enum для реализации singleton.

Это прекрасно, и я понимаю аргументы, соответственно, преимущества языка.

Я имею, однако, набор классов, которые я определяю singleton, но которые должны распространять другие классы, это невозможно с подходом enum, , поскольку перечисления не могут подклассы.

Джошуа Блох говорит в своих слайдах:

  • Но одна вещь отсутствует - вы не можете расширить тип перечисления
    • В большинстве случаев вы не должны
    • Один убедительный код использования case-operation

В большинстве случаев вам не следует: может кто-то уточнить, что? Я выполнил несколько сервлетов, и они расширяют HttpServlet, почему они не должны быть одиночными? Мне нужно только один экземпляр из них в моем приложении.

4b9b3361

Ответ 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 ссылается на расширение типа перечисления, а не на то, что одноэлементный тип расширяет что-то еще.