2010年03月04日 21:40 "hiswing"的内容
如何对值对象的生命周期进行监控
可能你对值对象含义没有真正把握,见这个讨论,值对象属于根实体管理的边界中,它的生命周期服从于实体。
2010年03月04日 21:40 "hiswing"的内容
若值对象是可变的,当改变任何一支铅笔的参数时,都会影响其它实体。
谈论值对象包括语义和语法两个层面。语义上的值对象是指缺乏标识,只有数据和行为的对象;语法上的值对象是指非引用类型对象(对象间赋值操作是值拷贝),与引用类型对象(对象间的赋值是引用拷贝)相对。
C++和C#支持语法非引用类型对象;Java除了基本类型,都为引用类型对象。比如:Java中DateTime语义上为值对象,语法上却是引用类型。为弥补语法与语义的差异,Java中通常用不可变(final)修饰引用对象,强制需要改变的时候进行值拷贝(clone)。
但是,即使在Java中,还是int这样的基本类型作为真正的值类型。如果要思考值对象的生命周期,可以考察一下int这些基本类型的生命周期,在使用DateTime这类对象时应该尽量模拟int这些基本类型。
[该贴被weidagang2046于2010-03-05 10:03修改过]
2010年03月05日 18:58 "hiswing"的内容
此时若改变值对象中某个属性,将会影响所有引用它的实体对象。如何来解决这一问题?
我在上面那个帖子里说了,所有属性都是相当于加final,是不能改的,如果要改,就把整个值对象换了。重新建立一个值对象和当前实体建立关系。
这就是更换关联关系,不改变值对象的值。
2010年03月04日 21:40 "hiswing"的内容
值对象一般应被设计为不可变的,这样就可以在任何对象中共享
语义上的值是不可以被共享的,比如:我的一块钱和你的一块钱是相等的,但不能被共享。在Java语法上,你看看int型变量就知道,它根本不可能被共享。
2010年03月06日 15:41 "weidagang2046"的内容
语义上的值是不可以被共享的,比如:我的一块钱和你的一块钱是相等的,但不能被共享
呵呵,这就是值+对象和单纯int值的区别所在,值对象可以被共享,例如一个屋子里有100个插座,那么一栋房子有好几个房间,就有好几百个插座,这是很浪费的,对象世界中的flyweight模式就是来解决这个问题的。
2010年03月06日 21:20 "banq"的内容
对象世界中的flyweight模式就是来解决这个问题的
是的,flyweight是基于值语义的对象引用;被共享的对象语义上是值,语法上是引用。
不过,对于这个插座的例子,我认为不属于flyweight模式。这里的插座是更接近实体对象而非值,插座与房子的关系是聚合关系。