我是一名 Java 开发人员,开始掌握依赖注入(inject)的全部威力,我突然意识到没有办法注入(inject)静态方法。所以我开始思考:静态方法是 DI 反模式吗?
更重要的是:如果我接受依赖注入(inject),这是否意味着我需要停止编写静态方法?我问是因为在单元测试期间没有办法模拟它们并注入(inject)模拟静态,这对我来说是一个巨大的关闭。
编辑:我知道“包装”和注入(inject)现有静态方法的常用方法是这样的:
public class Foo {
public static void bar() { ... }
}
public interface FooWrapper {
public void bar();
}
public class FooWrapperImpl implements FooWrapper {
public void bar() {
return Foo.bar();
}
}
...但我不是在问如何注入(inject)现有的静态方法...我是在问我是否应该完全停止编写它们,如果我的所有代码(从现在开始)都将接受这个概念DI。
此外,我看到很多与此类似的问题,但找不到提出相同问题的完全匹配项。如果您发现这确实是另一个问题的骗局,请指出给我,我将自己关闭这个问题(请不要只是关闭投票!)。
最佳答案
静态方法适用于没有关联状态的事物。一些工厂方法、“纯功能”方法如 Math.sin
等都是完全可以接受的静态方法。 java.lang.Math
和 java.util.Collections
有许多完全可以接受的静态方法的好例子。
幸运的是,这些方法不需要依赖注入(inject),也不需要与这些东西交互;它们并不难测试。他们没有需要模拟或任何东西的依赖项。
另一方面,静态或具有相关静态的静态方法是完全邪恶的。这是一种反模式。
当且仅当它总是在等效输入上返回等效输出时,通常有助于将方法定义为无状态(因此是合法的静态方法)。这清楚地表明,例如数据库查询和文件系统 I/O 使方法成为有状态的,因为它们的输出会根据文件系统或数据库中的内容而有所不同。
关于java - 静态方法是 DI 反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9367610/