不可变对象和Spring / Spring MVC:正确的选择?

时间:2014-09-08 08:29:33

标签: java spring spring-mvc

我经常尝试将我的类设计为不可变类,因此我在编码压力方面有很多优势。

但是与Spring合作,我有时会注意到框架"阻止"在大多数情况下,这种设计支持经典 JavaBeans 设计:默认构造函数+ getter / setters

我真的不喜欢 JavaBean 设计的对象,因为它们的疯狂可变性。 所以我想知道我是否遗漏了某些东西......

我尽量让我的课程设计尽可能优雅和可重复使用,但是框架需要更改此设计或以困难的方式允许它...

这有什么问题?

3 个答案:

答案 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)

它使用依赖注入将对象注入其他对象。因此,如果这些其他对象是不可变的,则无法改变其状态。