Каковы недостатки создания статических классов утилиты? Чем больше я сделал, тем больше я нахожу их чрезвычайно полезными. Я понимаю, что им не хватает объектно-ориентированного дизайна, но я все еще люблю их, вероятно, больше, чем должен. Существуют ли какие-либо другие недостатки для их использования?
Минусы статических классов утилиты в java?
Ответ 1
В них нет ничего плохого, в нужном контексте. Если у вас есть автономные методы без учета состояния (например, найденные в java.lang.Math
), то статический класс является идеальным местом для них. Единственная причина, по которой они относятся к классу, - это то, что Java не имеет понятия автономных методов.
Ответ 2
Основным недостатком IMO является невозможность, используя большинство из насмешливых фреймворков, издеваться над реализацией таких методов утилиты для модульного тестирования некоторого класса с использованием этих методов утилиты.
Например, с помощью System.currentTimeMillis()
легко получить текущее время. Но когда вам нужно протестировать класс, который использует текущее время для выполнения какой-либо работы, невозможно высмеять метод, чтобы он возвращал определенный момент времени. Использование объекта, реализующего интерфейс Clock
и вводимого в объект для проверки, делает его намного проще: вы можете создать макетную реализацию Clock, возвращающую определенную дату, когда ее попросят получить текущее время.
Ответ 3
Я говорил об этом некоторое время назад в сообщении, которое вы можете найти здесь здесь.
Основными проблемами в использовании статического метода являются:
- Мокинг, как указывали другие плакаты.
- Несколько версий статического класса могут быть загружены в приложение в зависимости от иерархии загрузчика класса и пути класса, настроенного для всей иерархии загрузчиков классов. (Третий элемент также, если загрузчик классов сначала настроен как родительский или младший) Делает тестирование и отлаживает этот кошмар.
- Статический метод не может быть унаследован. Следовательно, нарушает OCP (Открытый закрытый принцип), то есть статический метод не расширяется. Посмотрите на Log4J для типичных проблем со статическими методами.
- Статический метод не поддается применению либо Принцип разделения сегментов, либо Strategy. Невозможно иметь альтернативные реализации аналогичного алгоритма в зависимости от индивидуальных случаев использования, не прибегая к обильным количествам написанного вручную кода, распыляемого либерально с "если условия".
Но если сам метод не слишком громоздкий и в значительной степени предсказуем (т.е. не слишком много требований для разных вариантов реализаций и т.д.), то нет причин, по которым статический метод не соответствовал бы счету. Итак, мораль истории - это использовать ее, но осознавать побочные эффекты.