静态方法是否是 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.sinjava.lang.Mathjava.util.Collections

幸运的是,这些方法不需要依赖注入,也不需要与这些东西交互;它们并不是异常难以测试。他们没有需要嘲笑或任何东西的依赖关系。

另一方面,静态状态或具有关联静态状态的静态方法是完全邪恶的。这是一种反模式。

当且仅当方法始终在等效输入上返回等效输出时,它通常有助于将方法定义为非有状态方法(因此也是合法的静态方法)。这清楚地表明,例如数据库查询和文件系统I / O使方法具有状态,因为它们的输出将根据文件系统或数据库中的内容而变化。


答案 2

重要的静态方法与依赖关系注入兼容。只需将它们作为单例的实例方法即可。


推荐