当前位置: 首页 > 知识库问答 >
问题:

现场注射如何打破不变性

呼延聪
2023-03-14

我读到(例如这里)如果我使用字段依赖注入,那么我就不能创建不可变的对象,但我不明白字段依赖注入是如何打破不可变的,我可以做下面的事情,可以创建不可变的SpringTest,不是吗?

@Component
public final class SpringTest {

    @Autowired
    private Person person;

    // here I will have no setter methods exposing "person" object but will only have getter methods for "person" object, ensuring defensive copying etc...

}

更新:请注意,我的问题是关于字段注入打破不变性的,所以我想知道我的上述代码片段(自从我最初的问题以来发生了变化,感谢@Andy和其他人纠正了它)是如何打破不变性的,我想不是,所以我认为这个答案是错误的,关于场注入的不变性。

共有2个答案

谭思博
2023-03-14

不可变对象在构造之后不应该被修改。

Spring在构建对象后注入自动连接的私有字段。这与不变性原理相矛盾,因此不变性被打破。

但是,在通过构造函数注入进行自动连接的情况下,只要字段被声明为private final,我们就不会破坏不变性,因为这只会在对象构造期间将值设置为字段一次。

此外,如果Person对象是可变的,并且您有一个getter,那么它显然也打破了SpringTest的不可变性。

卫宁
2023-03-14

它是可变的,因为您可以自己(或从同一个包中的任何其他类)重新分配该字段。

仅仅打算不重新分配字段并不等同于不能这样做。

 类似资料:
  • 有谁能告诉我为什么@autowired表示不建议使用字段注入,而TextWriter对象“text”也表示无法自动连接,因为TextWriter类型的bean不止一个。我的密码。

  • 问题内容: 我这样承诺 返回一个promise,yes 不能被修改 。 我如何在第一场比赛中脱颖而出?(除了显式抛出错误以外,还有其他方法吗?) 问题答案: 我想你不想在这里连锁。以同步的方式,您会写 这就是应如何将其转化为承诺: 诺言没有实现。

  • 在处理高度并发的单例类的单元测试时,我偶然发现了以下奇怪的行为(在JDK 1.8.0\U 162上测试): main()方法的最后两行在INSTANCE的值上不一致-我猜JIT完全摆脱了该方法,因为该字段是静态final。删除final关键字可以使代码输出正确的值。 撇开你对单例的同情(或缺乏同情)不谈,暂时忘记像这样使用反射是在自找麻烦——我的假设是正确的吗?JIT优化是罪魁祸首?如果是这样的话

  • 我正在开发一个spring boot应用程序。在这个应用程序中,我使用以下代码将application.properties创建为spring bean 是否可以在Application.Properties中不使用Https.port字段来运行场景1?

  • 问题内容: 我尝试了这个: 只能得到: :声明前缺失 那么,我将如何打破JavaScript中的嵌套循环? 问题答案: 您应该能够打破标签,就像这样:

  • 如何将单词显示到列单元格内的下一行。我尝试过,但它对我无效。在上面的代码,但它不起作用。