Существуют ли штрафы для Enum Singletons? - PullRequest
2 голосов
/ 19 июля 2009

Существуют ли (производительность) штрафы *, связанные с Enum Singleton Pattern каким-либо образом, так как он, кажется, используется меньше, чем классический одноэлементный шаблон или идиома класса внутреннего держателя?

* Штрафы, такие как стоимость сериализуемости в случаях, когда она не нужна и так далее, или низкое использование, потому что мало кто из разработчиков читает Effective Java 2nd edition?

Ответы [ 2 ]

5 голосов
/ 19 июля 2009

Все одноэлементные шаблоны Java (как этот, так и стандартный с закрытым конструктором и статическим средством доступа) имеют это плохое свойство, что если вы их тестируете (или тестируете все, что даже удаленно зависит от них), можете использовать этот и только этот объект.

Например, если вы хотите проверить класс PrintingService, который зависит от PrintingSingleton, вы не сможете заменить этот печатный синглтон на макет, потому что он статически связан.

т.е. представьте себе тестирование этой функции

boolean printDocument(Document d) {
  if (PrintingSingleton.INSTANCE.isPrinterEnabled()) {
    PrintingSingleton.INSTANCE.print(d);
  }
  throw new RuntimeExeption("Printing not enabled");
}

с тестом

@Test(expectedExceptions = {RuntimeException.class})
public void testPrinting() {
  PrintingService service = ...
  service.print(new Document());  // How will you simulate 
                                  // throwing an exception?
} 

Лично я бы просто не использовал синглтоны таким образом, а скорее ввел бы внедрение зависимостей через Guice, Spring или Pico Container. Таким образом, вы гарантируете существование только одного объекта, не ограничивая себя тем, что не можете смоделировать объект, например, для испытаний.

1 голос
/ 20 июля 2009

Вы не получите никаких штрафов за производительность при использовании синглтона на основе Enum, поскольку Enums на самом деле являются обычными классами во время выполнения. Я полагаю, что вы можете получить очень небольшое снижение производительности во время загрузки классов, поскольку система может выполнять всю правильную инициализацию, необходимую для корректности. Быть сериализуемым не должно быть затрат, так как это всего лишь интерфейс тегов, проверяйте только, пытаетесь ли вы сериализоваться. Это действительно самый известный метод создания синглетонов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...