Являются ли статические методы анти-паттерном DI? - PullRequest
32 голосов
/ 20 февраля 2012

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

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

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

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.

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

Ответы [ 2 ]

41 голосов
/ 21 февраля 2012

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

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

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

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

3 голосов
/ 29 декабря 2013

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

...