是否有一个特定的原因使视图bean不可变?

时间:2011-05-05 16:58:45

标签: java model-view-controller jsp javabeans

一位同事最近建议我们应该将模型对象/ bean从应用程序的服务层传递给视图不可变。

有没有具体的理由这样做,有什么好处或缺点?这个想法来自哪里?

3 个答案:

答案 0 :(得分:2)

这是一个好主意取决于唯一的目的。如果它是纯视图bean(因此不是真正的模型bean),那么使它们不可变可能确实有意义。这是相对容易的:只需删除setter。这可以防止视图更改bean,例如<c:set><jsp:setProperty>

但总而言之,我认为这是不必要的夸大,除非您想将视图bean作为第三方API提供并以这种方式防止误解/误用。或者如果你真的需要setter,那么它们可能根本不应该是不可变的。

答案 1 :(得分:2)

这个想法可能来自Data Transfer Objects (DTO)的概念。 DTO是服务器和客户端之间的传输对象。使DTO不可变的想法是它只是被读取;客户端会将DTO的属性转换为自己的表示,并在自己的对象上进行突变。

然后,客户端将DTO发送回服务器,然后服务器将DTO复制到其自己的内部表示中,并对其执行突变。这将允许客户端和服务器仍然绑定到DTO提供的消息合同,但在执行内部操作时不受约束约束。

例如,将StockDTO对象发送到客户端的服务器可以在内部将股票信息保存在业务流对象中。但是,客户可以将StockDTO添加到内部交易对象中,在表格中查看。

这是概念,但同样,设计完全取决于您。

答案 2 :(得分:1)

如果bean在视图中是只读的,那么这样做是没有错的。它可能有助于防止在您不希望更改它们的位置更改它们。但是,您需要考虑如何构造这些对象,以及是否打算更改其状态预览。