我是一名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的概念。
另外,我看到了很多与此类似的相关问题,但是找不到完全相同的问题。如果您发现这确实是对另一个问题的重复,请向我指出,然后我将自己关闭此问题(请不要只是对它进行投票!)。
静态方法适用于没有 关联状态的 事物 。 一些工厂方法,“纯粹功能”方法(例如Math.sin和)都是完全可接受的静态方法。 java.lang.Math并java.util.Collections有许多可以完全接受的静态方法的精美示例。
Math.sin
java.lang.Math
java.util.Collections
幸运的是,这些方法不需要依赖注入,也不需要与之交互。他们并非异常难以测试。他们没有需要模拟或任何东西的依赖项。
另一方面,静态或带有关联静态的静态方法完全是邪恶的。那 是 一种反模式。
当且仅当它总是在等效输入上返回等效输出时,它通常有助于将方法定义为无状态的(因此是合法的静态方法)。这清楚地表明,例如数据库查询和文件系统I / O使方法成为有状态的,因为它们的输出将根据文件系统或数据库中的内容而有所不同。