Являются ли статические методы анти-шаблоном DI?

Я разработчик Java, который начинает понимать всю мощь инъекций зависимостей, и мне внезапно стало ясно, что нет способа вводить статический метод. Так это заставило меня задуматься: статические методы DI анти-шаблоны?

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

Изменить: я знаю, что общий способ "обернуть" и ввести существующий статический метод выглядит так:

public class Foo {
    public static void bar() { ... }
}

public interface FooWrapper {
    public void bar();
}

public class FooWrapperImpl implements FooWrapper {
    public void bar() {
        return Foo.bar();
    }
}

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

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

Ответ 1

Статические методы подходят для вещей, которые не имеют связанного состояния. Некоторые заводские методы, "чисто функциональные" методы, такие как Math.sin и т.п., Являются вполне приемлемыми статическими методами. java.lang.Math и java.util.Collections содержит много прекрасных примеров вполне приемлемых статических методов.

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

С другой стороны, статическое состояние или статические методы со связанным статическим состоянием являются совершенно злыми. Это анти-шаблон.

Это часто помогает определить метод как не-stateful (и, следовательно, законный статический метод), если и только если он всегда возвращает эквивалентный вывод на эквивалентных входах. Это дает понять, что, например, запросы к базе данных и ввода-вывода файловой системы делают методы работоспособными, поскольку их выходы будут различаться в зависимости от того, что в файловой системе или базе данных.

Ответ 2

Нетривиальные статические методы не совместимы с инъекцией зависимостей. Просто сделайте им экземплярные методы одиночных чисел.