何时将参数作为构造函数参数或方法参数传递

When to pass a parameter as a constructor parameter or as a method parameter

我目前有这个 class 在 class 方法中使用服务 class。目前我正在我的方法中创建服务 class 的实例,如下所示。我想知道的问题是,当涉及到测试时,我使用的是 spock,当在方法中创建 class 的新实例而不是作为构造函数传入时,似乎很难测试依赖注入的参数。我想知道将 Service class 的实例作为构造函数参数传递给 Handler 是否是执行此操作的正确方法?谢谢

public class Handler{
   private Service service;

    public Handler(){}

public void someMethod(ObjectNeededForService object){
   service = new Service(object);
}
}

这是一个棘手的问题,您会找到不同的答案。 如果我理解正确,您基本上是在问构造函数注入是否优于 setter 注入,反之亦然,对吗?

显然,当您 class 中的字段数量有限时,构造函数注入很简洁。带有 20 个参数的构造函数可读性不佳,绝对应该避免。在那种情况下,您将不得不使用 setter 注入并为各个字段一一调用 setters。

但也许如果你有一个 class 有很多需要注入的字段,那么重构并将你的依赖项减少到更小的数量会很好。

我个人更喜欢构造器注入,但也有人反对它。