当前位置: 首页 > 面试题库 >

静态方法是DI反模式吗?

庞鸿骞
2023-03-14
问题内容

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

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

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

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



 类似资料:
  • 问题内容: 我刚刚在一些我未编写的代码中发现了一个错误,我对此感到有些惊讶: 尽管该代码在输入数据上失败了很多 _(因为它试图以17.01.2011格式查找日期并返回诸如10396/2011之类的东西,然后由于无法解析日期而崩溃,但这 确实是错误 的)这个问题的重点;)_我想知道: Pattern.compile 的要点之一不是要进行速度优化(通过预编译正则表达式)? 难道不是所有的“静态”模式都

  • 问题内容: 我的代码中有一个静态方法,希望以某种方式进行模拟。 我正在使用jmock。 我想可以做到这一点的一种方法是在静态方法周围设置“包装类”并模拟该方法,但是我希望有一个更好的解决方案。 我要用这种错误的方式? 反馈: 我将要有一个接口和一个类,该接口和类具有一个仅称为静态方法的方法。这将允许我通过仅模拟对此包装器类的调用来模拟逻辑。(即使谈论它我也觉得很脏:)) 问题答案: 我们不支持在j

  • 例如,我有以下课程: 我有一个类使用她的方法: 测试等级: 尝试运行测试时遇到的错误: 组织。莫基托。例外情况。基础MockitoException:对于TesteStatico,静态模拟已在当前线程中注册以创建新的模拟,必须取消注册现有的静态模拟注册 项目中LIB的版本: junit-jupiter 5.5.2 mockito-junit-jupiter 3.2.14 mockito-内联3.2

  • 我在一个类中有一个静态方法。方法不是最终的。我一直得到一个when()需要一个参数,该参数必须是'a method call on a mock‘错误。下面是我的代码。

  • 在安装到AEM 5.6.1实例之前,我正在使用maven构建和测试我的代码。我已经编写了单元测试,这些测试使用wcm的实现从aem模拟中获益。io和其他需要使用powermockito模拟静态方法的单元测试。 以下是我对aem上下文、sling Mock和powermock的maven依赖关系。 在我的课堂上,我正在为aem上下文设置规则,并准备一些用于模拟的静态类: 当我通过命令行运行mvn测试

  • rank ▲ ✰ vote url 31 549 117 733 url 静态方法 Python有没有静态方法使我可以不用实例化一个类就可以调用,像这样: ClassName.StaticMethod ( ) 是的,用静态方法装饰器 class MyClass(object): @staticmethod def the_static_method(x): pri