一尘不染

静态方法是DI反模式吗?

java

我是一名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的概念。

另外,我看到了很多与此类似的相关问题,但是找不到完全相同的问题。如果您发现这确实是对另一个问题的重复,请向我指出,然后我将自己关闭此问题(请不要只是对它进行投票!)。


阅读 189

收藏
2020-12-03

共1个答案

一尘不染

静态方法适用于没有 关联状态的 事物 一些工厂方法,“纯粹功能”方法(例如Math.sin和)都是完全可接受的静态方法。
java.lang.Mathjava.util.Collections有许多可以完全接受的静态方法的精美示例。

幸运的是,这些方法不需要依赖注入,也不需要与之交互。他们并非异常难以测试。他们没有需要模拟或任何东西的依赖项。

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

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

2020-12-03