我应该让对象变得可变吗?

时间:2015-07-13 10:34:23

标签: java design-patterns immutability

我有一个service A来侦听来自队列的消息,并调用另一个service B来获取一些值假定为val1 ... x。

假设我的实体是

Entity
|- val1
|- val2
|
... val1n

来自service B填充的值假定实体中的x个值。 在服务调用service A之后,计算一些值并填充实体中的其他字段。

Entity

进行建模的可能方法

[1]使实体不可变,并使实体的每次更新都复制所有值1 ... x以生成新对象。

[2]使实体部分不可变,如声明val1 ... x final和其他非final,所以我可以使用setters来设置它们的值。

编辑:[3]继续传递Builder对象,当所有值val1 ... n都已填充时,调用build()函数。

EDIT2:[4]有两个独立的对象(私有内部)不可变 - val1 ... x和不可变的valx..n。每次在valx..n上发生一些更新时,我将创建可变对象的新副本并引用不可变对象。

2 个答案:

答案 0 :(得分:2)

如果我理解正确你愿意在一个服务中创建对象,填充一些字段,而不是将其传递给另一个服务,并填充其余的服务?在此之后,对象是完整的吗?

如果是这样,我会使用构建器模式,填充builer的字段,一旦完成 - 构建不可变对象

答案 1 :(得分:1)

service B返回一个不可变的值对象(让我们称之为ExtendedEntityInformation),然后使用service A中的值和该对象来创建不可变的Entity }。您甚至可以将ExtendedEntityInformation对象存储在Entity中,如果需要,可以在Entity上实施授予ExtendedEntityInformation中getter的getter。