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

Минусы статических классов утилиты в java?

Каковы недостатки создания статических классов утилиты? Чем больше я сделал, тем больше я нахожу их чрезвычайно полезными. Я понимаю, что им не хватает объектно-ориентированного дизайна, но я все еще люблю их, вероятно, больше, чем должен. Существуют ли какие-либо другие недостатки для их использования?

4b9b3361

Ответ 1

В них нет ничего плохого, в нужном контексте. Если у вас есть автономные методы без учета состояния (например, найденные в java.lang.Math), то статический класс является идеальным местом для них. Единственная причина, по которой они относятся к классу, - это то, что Java не имеет понятия автономных методов.

Ответ 2

Основным недостатком IMO является невозможность, используя большинство из насмешливых фреймворков, издеваться над реализацией таких методов утилиты для модульного тестирования некоторого класса с использованием этих методов утилиты.

Например, с помощью System.currentTimeMillis() легко получить текущее время. Но когда вам нужно протестировать класс, который использует текущее время для выполнения какой-либо работы, невозможно высмеять метод, чтобы он возвращал определенный момент времени. Использование объекта, реализующего интерфейс Clock и вводимого в объект для проверки, делает его намного проще: вы можете создать макетную реализацию Clock, возвращающую определенную дату, когда ее попросят получить текущее время.

Ответ 3

Я говорил об этом некоторое время назад в сообщении, которое вы можете найти здесь здесь.

Основными проблемами в использовании статического метода являются:

  • Мокинг, как указывали другие плакаты.
  • Несколько версий статического класса могут быть загружены в приложение в зависимости от иерархии загрузчика класса и пути класса, настроенного для всей иерархии загрузчиков классов. (Третий элемент также, если загрузчик классов сначала настроен как родительский или младший) Делает тестирование и отлаживает этот кошмар.
  • Статический метод не может быть унаследован. Следовательно, нарушает OCP (Открытый закрытый принцип), то есть статический метод не расширяется. Посмотрите на Log4J для типичных проблем со статическими методами.
  • Статический метод не поддается применению либо Принцип разделения сегментов, либо Strategy. Невозможно иметь альтернативные реализации аналогичного алгоритма в зависимости от индивидуальных случаев использования, не прибегая к обильным количествам написанного вручную кода, распыляемого либерально с "если условия".

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