构造函数依赖注入如何影响不可变性?

4
我正在阅读Spring文档,想知道他们所说的:

Spring团队通常推荐使用构造函数注入,因为它使得可以将应用程序组件实现为不可变对象,并确保所需的依赖关系不为null。

我不明白它是如何使组件成为不可变的。 虽然我理解使用基于构造函数的DI类似于使用Java自然方式创建具有final字段的类对象,从而防止对象更改字段引用。

这是他们使用这样的短语的唯一原因吗? 有人能向我解释一下吗?

谢谢。


3
正是出于你所提出的原因。如果您使用设置器注入,您将需要一个可变对象。 - Oliver Charlesworth
1个回答

7
如果您有一个具有依赖项的类,并且所有这些依赖项都作为构造函数参数提供,那么您就可以知道对象永远不会存在依赖项无效的状态(除非您显式地传递 null 或错误值,但如果您想要,可以在构造函数中进行一些验证)。
因此,您的类不再需要针对这些依赖项设置setter,因此您知道,在字段是私有的情况下,应用程序中的流氓代码无法将有效的依赖项替换为无效的依赖项。如果bean具有很高的可见性(例如,应用程序范围)并且被许多客户端对象使用,则特别适用于此。
如果没有setter或任何其他修改状态的方法,并且所有字段都是私有的,则该类可能完全变为 immutable (创建后无法更改其状态)。。
在多线程应用程序中,不可变对象更有可能表现良好,尽管该类仍然需要在内部进行线程安全处理,但您不必担心外部客户端协调访问该对象。

优秀的回答! - Manish Kumar Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接