Java Singleton vs static — есть ли реальное преимущество в производительности?

Я объединяю ветку CVS, и одно из самых больших изменений — это замена шаблона Singleton везде, где он встречается, абстрактными классами со статическим блоком инициализации и всеми статическими методами.

Стоит ли это сохранить, так как это потребует слияния множества конфликтов, какую ситуацию я бы рассматривал, чтобы этот рефакторинг был целесообразным?

Мы запускаем это приложение под Weblogic 8.1 (так что JDK 1.4.2)


простите, Томас, позвольте мне уточнить..

версия HEAD имеет традиционный одноэлементный шаблон (закрытый конструктор, getInstance() и т. д.)

версия ветки не имеет конструктора, является «общедоступным абстрактным классом» и изменила все методы объекта на «статические». Код, который раньше существовал в приватном конструкторе, перемещается в статический блок.

Затем все варианты использования класса изменяются, что вызывает множественные конфликты при слиянии.

Есть несколько случаев, когда это изменение было сделано.


person Community    schedule 26.08.2008    source источник


Ответы (7)


С точки зрения строгой производительности во время выполнения разница действительно незначительна. Основное различие между ними заключается в том, что «статический» жизненный цикл связан с загрузчиком классов, тогда как для синглтона это обычный жизненный цикл экземпляра. Обычно лучше держаться подальше от дела ClassLoader, так вы избежите некоторых каверзных проблем, особенно когда пытаетесь перезагрузить веб-приложение.

person Damien B    schedule 26.08.2008
comment
Синглтон привязан к времени жизни ClassLoader загрузчика классов, который его загрузил, так же, как и статический. - person Tom Hawtin - tackline; 12.09.2008
comment
И? Все привязано к времени жизни ClassLoader, но, добавляя синглтон, вы получаете дополнительный уровень жизненного цикла с большим количеством шансов (финализировать) для правильной обработки вещей. - person Damien B; 04.10.2008

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

person levand    schedule 26.08.2008

Static плохо подходит для расширяемости, поскольку статические методы и поля не могут быть расширены или переопределены подклассами.

Это также плохо для модульных тестов. В модульном тесте вы не можете предотвратить распространение побочных эффектов различных тестов, поскольку вы не можете контролировать загрузчик классов. Статические поля, инициализированные в одном модульном тесте, будут видны в другом, или, что еще хуже, одновременный запуск тестов приведет к непредсказуемым результатам.

Синглтон, как правило, является хорошим шаблоном, если его использовать экономно. Я предпочитаю использовать структуру DI и позволяю ей управлять моими экземплярами (возможно, в разных областях, как в Guice).

person Mark Renouf    schedule 26.08.2008

Если мой первоначальный пост был правильным пониманием, а дискуссия от Sun, на которую была ссылка, точна (что, я думаю, может быть), то я думаю, что вам нужно найти компромисс между ясностью и производительностью.

Задайте себе эти вопросы:

  1. Делает ли объект Singleton более понятным то, что я делаю?
  2. Нужен ли мне объект для выполнения этой задачи или он больше подходит для статических методов?
  3. Нужна ли мне производительность, которую я могу получить, не используя синглтон?
person Thomas Owens    schedule 26.08.2008
comment
На самом деле вопрос в приросте производительности :-) Предположим, у вас есть контроллер, который обрабатывает 100 запросов в секунду. актуально ли это для выбора между синглтоном или классом в качестве службы без гражданства? - person lisak; 02.04.2011

По моему опыту, единственное, что имеет значение, это то, какой из них легче имитировать в модульных тестах. Я всегда чувствовал, что Синглтона легче и естественнее высмеивать. Если ваша организация позволяет вам использовать JMockit, это не имеет значения, поскольку вы можете преодолеть эти проблемы.

person Cem Catikkas    schedule 26.08.2008

Поможет ли это обсуждение? (не знаю, запрещено ли ссылаться на другой форум по программированию, но я бы не стал просто цитировать всю дискуссию =))

Обсуждение Sun по этому вопросу

Судя по всему, в большинстве случаев это не имеет большого значения, хотя технически статические методы более эффективны.

person EdgarVerona    schedule 26.08.2008

Напишите код для измерения производительности. Ответ будет зависеть от JVM (Sun JDK может работать иначе, чем JRockit) и флагов VM, которые использует ваше приложение.

person Rob Spieldenner    schedule 09.09.2008