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

How does constructor-based dependency injection affects immutability?

我正在阅读 Spring 文档,我想知道他们写的是什么意思:

The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null.

我看不出它以什么方式实现不可变的组件。 虽然我知道使用基于构造函数的 DI 类似于一种自然的 Java 方法来创建具有最终字段的 class 的对象,从而防止对象更改字段引用。

这是他们使用这样一个短语的唯一原因吗? 有人可以给我解释一下吗?

谢谢。

如果你有一个带有依赖关系的 class 并且所有这些依赖关系都作为构造函数参数提供,那么你可以知道该对象永远不会存在于依赖关系无效的状态(除非你明确传递空值或错误的值,但如果需要,您可以在构造函数中进行一些验证)。

您的 class 不再需要这些依赖项的设置器,因此您知道应用程序中的恶意代码不可能(假设字段是私有的)用无效的依赖项替换有效的依赖项。如果 bean 具有高可见性(例如,应用程序范围)并且被许多客户端对象使用,这可能尤其适用。

class 有可能完全不可变(创建后无法更改其状态)。如果没有 setter 或任何其他修改状态的方法,并且所有字段都是私有的,就会出现这种情况。

不可变对象更有可能在多线程应用程序中表现良好。尽管 class 仍然需要在内部实现线程安全,但您不必担心外部客户端协调对该对象的访问。