Класс полезности в приложении Spring - использовать статические методы или нет?
Скажем, у меня есть класс утилиты DateUtil (см. ниже). Чтобы использовать этот метод
метод вызывающего объекта использует DateUtils.getDateAsString(aDate). Было бы лучше удалить
статический модификатор и сделайте DateUtil a spring bean (см. DateUtilsBean) и введите его в классы вызова
или просто оставить его как есть?
Один недостаток, который я вижу при использовании статики, - это проблемы вокруг насмешек, см. Как насмехаться со статическими методами?
public class DateUtils {
public static String getDateAsString(Date date) {
String retValue = "" // do something here using date parameter
return retValue;
}
}
Spring bean версия
@Component
public class DateUtilsBean {
public String getDateAsString(Date date) {
String retValue = "" // do something here using date parameter
return retValue;
}
}
Ответы
Ответ 1
Я так не думаю. Класс DateUtils звучит как чистый служебный класс, который не имеет побочных эффектов, а просто обрабатывает входные параметры. Подобная функциональность также может оставаться в статическом методе. Я не думаю, что это очень вероятно, что вы захотите высмеять методы помощников даты.
Ответ 2
Было бы лучше объявить его как Spring bean, потому что его жизненный цикл управляется с помощью Spring, и вы можете в конечном итоге ввести зависимости, скомпилировать объект, а также протестировать его в надлежащим образом, чтобы не говорить, что вы можете использовать его как обычный объект и передать его как параметр, переопределить метод в подклассах и т.д.
Короче говоря, да, в большинстве случаев это был бы лучший дизайн. Тем не менее, в случае, столь же простом, как и разоблачение, это не имеет большого значения.
Ответ 3
Я согласен с Шон Патрик Флойд.
Это мой критерий: если методы класса делают вещи только по параметрам, которые они получают, без внешних зависимостей (база данных, файловая система, пользовательская конфигурация, другие объекты / beans и т.д.), тогда я бы сделайте это со статическими методами, обычно в конечном классе с частным конструктором.
В противном случае я бы выполнил его с помощью Spring bean.
Итак, в случае, когда вы поднимаете, в соответствии с этим критерием, я бы написал класс со статическими методами.
С уважением.