Gwt 在什么条件下使用字段注入而不是构造函数注入是有效的?

Gwt 在什么条件下使用字段注入而不是构造函数注入是有效的?,gwt,dependency-injection,dependencies,guice,Gwt,Dependency Injection,Dependencies,Guice,我使用GUICE作为依赖注入容器。如果我可以选择构造函数注入或字段注入,我相信我应该总是更喜欢构造函数注入而不是字段注入。我的理解正确吗 是否存在任何有效的用例,其中字段注入比构造函数注入更有意义?是的,您是正确的。尽可能避免现场注入 我认为,最重要的是,当您使用构造函数注入时,您可以绝对确保您的对象永远不会处于不一致的状态,因为如果不先创建其依赖项,您就无法创建这样的对象。此外,构造函数中声明的依赖项为您的类提供了明确的契约——您可以很容易地看到该类依赖于什么。现场注入并不总是如此 此外,您可

我使用GUICE作为依赖注入容器。如果我可以选择构造函数注入或字段注入,我相信我应该总是更喜欢构造函数注入而不是字段注入。我的理解正确吗


是否存在任何有效的用例,其中字段注入比构造函数注入更有意义?

是的,您是正确的。尽可能避免现场注入

我认为,最重要的是,当您使用构造函数注入时,您可以绝对确保您的对象永远不会处于不一致的状态,因为如果不先创建其依赖项,您就无法创建这样的对象。此外,构造函数中声明的依赖项为您的类提供了明确的契约——您可以很容易地看到该类依赖于什么。现场注入并不总是如此

此外,您可以在没有DI框架的情况下使用这些对象,例如在单元测试中。相反,使用字段注入(尤其是当字段是私有的时),您不能在DI容器之外使用类,而不会带来太多麻烦。如果您使用字段注入并希望具有可移植性,那么字段也不能是final,这很糟糕,因为您应该尽量使对象不可变

几乎不需要现场注射。它们只适用于可选依赖项(甚至对于这些依赖项,我建议改用方法注入)或特殊的“方面”依赖项,例如记录器


另一个极具争议的用例是当您需要创建一个具有多个超类的类时,每个超类都有依赖项。使用构造函数注入,您必须将所有超类的所有依赖项通过所有构造函数传递到顶部。这可能不方便,现场注入解决了这一问题。但这是一个非常罕见的用例(我在实践中只遇到过一次),我个人认为通过多个构造函数传递依赖关系并没有那么糟糕。

我使用字段注入的一个好地方是当您有一个需要依赖关系的基类,但子类不需要依赖关系时。如果严格使用ctor注入,那么最终会得到许多参数,这些参数必须传递给super()调用。当您的基类需要另一个参数时,您必须更新所有的子类。@jgindin,是的,这是我在上一段中的意思的一部分。但我认为方法注入和字段注入一样好,但也更加灵活。有了支持@PostConstruct的框架,我觉得字段注入和构造函数注入似乎成了一种风格。特别是当您正在编写可序列化服务时,使用final字段并不会带来太多好处。我倾向于根据具体情况使用这两种方法,因为我确实发现field injection的阅读效果更好。我认为这是一个风格问题,不能用真/假来回答。我会问另一个问题:除非您编写的代码必须在没有DI的情况下使用,否则为什么要关心构造函数/setter注入?