【问题标题】:Does dependency injection mean no inline initialization?依赖注入是否意味着没有内联初始化?
【发布时间】:2017-09-30 13:19:17
【问题描述】:

如果我遵循依赖注入原则进行类设计,我应该确保我的类不会尝试在我的类中实例化它的依赖项,而是通过构造函数请求对象。

通过这种方式,我可以在对类进行单元测试时控制我为类提供的依赖项。这个我明白。

但我不确定这是否意味着遵循依赖注入原则的良好类设计意味着它的字段永远不应该内联初始化?我们是否应该完全避免内联初始化以生成可测试的代码?

编辑

1 和 2 哪个更好?

1

  public class Car {
       private Tire tire = new Tire(); // 
    }

2

public class Car {

   private Tire tire;
   public Car(Tire tire) {
       this.tire = tire
   }
}

【问题讨论】:

  • 这显然取决于字段的类型。当您只在该类中需要它们时,注入“基本”类型(如Number、日期相关(java.time)类或StringBuilder)是没有意义的。
  • “内联初始化”到底是什么意思?那些字段是由类本身在构造函数中初始化的还是什么?
  • 我应该确保我的类不会尝试在我的类中实例化它的依赖项:当然。不过,这正是您的第一个 sn-p 所做的。所以你有你的答案。必须从类外部提供依赖项。这显然不是你的第一个 sn-p 的情况。
  • @JBNizet 是的,这很清楚。但这总是规则吗?这是否意味着如果我在一个类中看到内联初始化,这是一个糟糕的设计?
  • 没有。当然不是。依赖注入是一种工具,适合在某些情况下使用,而不适合在其他情况下使用。

标签: java unit-testing testing


【解决方案1】:

不,它肯定不意味着内联初始化。 我不是 Java 用户,但这个术语与许多编程语言相关。

基本上,不是让您的对象创建依赖项或要求工厂对象为它们创建一个依赖项,而是将所需的依赖项从外部传递给对象,然后将其变成其他人的问题。

public SomeClass() {
    myObject = Factory.getObject();
}

“依赖注入”是 5 美分概念的 25 美元术语。 [...] 依赖注入意味着给一个对象它的实例变量。 [...]。

依赖注入基本上是提供对象需要的对象(它的依赖项),而不是让它自己构造它们。这是一种非常有用的测试技术,因为它允许模拟或删除依赖项。

任何应用程序都由许多对象组成,这些对象相互协作以执行一些有用的事情。传统上,每个对象都负责获取自己对与之协作的依赖对象(依赖项)的引用。这导致了高度耦合的类和难以测试的代码。

A lot of reference from here

【讨论】:

    【解决方案2】:

    在我看来,一般来说,如果你认为数据字段是一个依赖,那么就让依赖管理容器来管理它。什么是依赖,什么不是依赖是一个棘手的问题,只有你可以决定。

    例如:如果您的汽车设计允许使用不同类型的轮胎,那么它就是一个依赖项。否则,在 Car 类中,您将不得不使用某种 TyreFactory,这并不合理。

    如果您使用 DI 容器,测试类将变得轻而易举。您必须为课程提供一个存根/模拟,这显然是一个真正的好处。那么,在您的示例中,如果您采用第一个解决方案,那么您将如何测试您的汽车是否适用于不同类型的轮胎?

    【讨论】:

      猜你喜欢
      • 2012-02-08
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 2016-06-08
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多