我经常尝试将我的类设计为不可变类,因此我在编码压力方面有很多优势。
但是与Spring合作,我有时会注意到框架"阻止"在大多数情况下,这种设计支持经典 JavaBeans 设计:默认构造函数+ getter / setters 。
我真的不喜欢 JavaBean 设计的对象,因为它们的疯狂可变性。 所以我想知道我是否遗漏了某些东西......
我尽量让我的课程设计尽可能优雅和可重复使用,但是框架需要更改此设计或以困难的方式允许它...
这有什么问题?
答案 0 :(得分:2)
对于Web表单数据绑定(即表单POST),问题是Java反射在构造函数上很弱,因此很难在没有注释的情况下进行数据绑定。很久以前,我打算提交一个错误,Spring数据绑定应该利用经常被遗忘的@ConstructorProperties
(iirc我自己考虑做补丁,但它相当复杂,会破坏很多东西)。有人应该提交功能请求。
顺便说一句,我在谈论Web数据绑定(而不是依赖注入),因为Spring已经很长时间对基于构造函数的DI有很大的支持(不可变对象需要基于构造函数的注入)。事实上,我会说基于构造函数的注入或(静态方法工厂)正在成为优于传统getter / setter组件的首选实践(你可以在许多Spring类中看到这种情况,多年来一直在向最终版本和构造函数转移)。
无论如何,我能够使用Jackson https://gist.github.com/agentgt/4458079
对不可变对象进行Web数据绑定(尽管使用Jackson进行数据绑定请求不一定是JSON)
您可能还希望看到Spring Webflow DataBinding to immutable objects via a constructor?我原来想出的要点并提供更多信息。
答案 1 :(得分:0)
我有时会创建单独的不可变“设计模型”类和可变(Java Bean)“MVC模型”类来避免这类问题。
答案 2 :(得分:-2)
它使用依赖注入将对象注入其他对象。因此,如果这些其他对象是不可变的,则无法改变其状态。