java - 静态方法是 DI 反模式吗?

标签 java dependency-injection mocking static-methods

我是一名 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.Mathjava.util.Collections 有许多完全可以接受的静态方法的好例子。

幸运的是,这些方法不需要依赖注入(inject),也不需要与这些东西交互;它们并不难测试。他们没有需要模拟或任何东西的依赖项。

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

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

关于java - 静态方法是 DI 反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9367610/

相关文章:

c# - Rhino Mocks - 通过多次调用模拟其返回值发生变化(即使传递相同参数)的方法

java - mybatis使用foreach进行批量插入

java - Spring 依赖注入(inject) - 使用实例化对象

java - 我如何在 Jersey 中使用 supportsNullCreation()?

c# - 在 Startup.cs 中使用 DI 解析服务

c# - 如何模拟从另一个方法调用的方法

Ruby 的 vcr 的 Java 替代品?

java - webapp 的 Maven 原型(prototype)

java - 通过获取 imageview android 的标签位置来设置图像资源

java - 如何删除数组中的最小值?