这个值对象共享出来的时候不是把真实的“自我”共享出来,而是提供一个副本给其他某个引用对象。 ...
恩,这个方向我也曾考虑过,不过我注意到一点,这是两个方向,效果是一样的。但是理解不同,可能产生的效率也不同,代码如下:
副本流:
class A{ ``` public String getVO(){ return VO.deepCopy(); } } //外界 VO vo = a.getVO(); vo.setField1(vo.getField1()+"0"); a.setVO(vo);
|
不变流:
class A{ ``` public String getVO(){ return vo;//注意,该方式VO是没有set方法。 } } //外界 VO oldVO = a.getVO(); String field1 = oldVO.getField1();//取出旧VO中的值 String newField1 = field1+"0";//这里可以理解为领域逻辑 VO newVO = new VO(newField1);//构建新状态,新的VO只能创建出来,新旧没任何改变,实现状态迁移的同时,也满足共享。 a.setVO(newVO);//状态迁移
|
比较这两种情况,两种都是在setVO实现状态迁移(即之前不会有任何改变)。这两种的区别是,第一种是保留set方法,但每次访问都需要建立副本,变更时,只与副本相关,与本体无关;第二种是去掉set方法,每个VO都是如同1、2、"123"、12.5、true等成为“值”的存在,变更时,是把VO中的值获取出来,赋给一个变量,在变量上作变化,变化后,作为VO的构造构建一个新的VO,用作状态迁移(状态迁移则是迁移前后的两个状态,即只有两个VO,只读取不迁移则不需要创建新状态)。
In my opinion,把第二种方法所有变量都用一个带set的VO封装起来的话,就与第一种同理了。第一种里的副本已经不是VO了,“值”本身不可变,而是变量可变,值变化是概念的彻底变化,如1不是1了,用2代替1,1代替2,于是有2+2=1,这是值变化带来的,也就是说只要概念不发生变化,值是不存在变化的。
总的来说,我的观点是:值带有可以改变自身概念的方法就不是值了。
PS:发现这问题可以深入探讨,欢迎新观点、新概念出现。