静态方法是DI反模式吗?

我是一名Java开发人员,他开始掌握dependency injection的全部function,我突然意识到没有办法注入静态方法。 所以它让我思考: 静态方法DI反模式?

更重要的是:如果我接受dependency injection,这是否意味着我需要停止编写静态方法? 我问,因为没有办法在unit testing中模拟它们并注入模拟静态,这对我来说是一个巨大的转折点。

编辑 :我知道“包装”和注入现有静态方法的常用方法是这样的:

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的概念。

此外,我看到了许多与此类似的相关问题,但无法找到提出相同问题的完全匹配。 如果你发现它确实是另一个问题的愚蠢,请指出我,我将自己关闭这个问题(请不要只是关闭它!)。

静态方法适用于没有关联状态的事物 一些工厂方法,像Math.sin这样的“纯function”方法等都是完全可以接受的静态方法。 java.lang.Mathjava.util.Collections有许多完全可以接受的静态方法的优秀例子。

幸运的是,这些方法不需要dependency injection,也不需要与这些东西进行交互; 他们并不难以测试。 他们没有需要嘲笑或任何东西的依赖。

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

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

非平凡的静态方法与dependency injection兼容。 简单地使它们成为单身的实例方法。