Сведения о вопросе

Sadijon

15:49, 9th August, 2020

Теги

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

Просмотров: 448   Ответов: 7

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

Это то, что стоит сохранить, поскольку это потребует слияния большого количества конфликтов, какую ситуацию я бы рассматривал для того, чтобы этот рефакторинг был стоящим?

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


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

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

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

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

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



  Сведения об ответе

crush

07:08, 13th August, 2020

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


  Сведения об ответе

прога

09:57, 27th August, 2020

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


  Сведения об ответе

JUST___

17:19, 14th August, 2020

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

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

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


  Сведения об ответе

lesha

05:43, 13th August, 2020

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

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

  1. Делает ли объект Singleton то, что я делаю, более ясным?
  2. Нужен ли мне объект для выполнения этой задачи или он больше подходит для статических методов?
  3. Нужна ли мне производительность, которую я могу получить, не используя Singleton?


  Сведения об ответе

darknet

10:23, 14th August, 2020

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


  Сведения об ответе

KOMP

23:19, 7th August, 2020

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

ВС дискуссия на эту тему

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


  Сведения об ответе

+-*/

03:52, 4th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться