知识卡片
值对象的不可变性与走样问题
内容
值对象应该是不可变的:不能把代表1月1日的对象直接改成代表1月2日,而应创建一个新对象替换它。规则根源是走样(aliasing)问题——若值对象被多处共享,一处原地修改它的值,会在开发者没预期的地方悄悄改变别处看到的值。UML用数据类型(data type)关键词标注类型系统内建值类型,但数据类型和值对象不完全等同:数据类型不能有标识,值对象可以有标识,Date是值对象但不是原生数据类型。
参考来源
- 位置:《UML精粹:标准对象建模语言简明指南(第3版)》第5章《类图:进阶概念》(源文件:_epub-src/EPUB/4.xhtml)
- 结论依据:原文说明"值对象应该是不可变的……你应该创建一个新的2-Jan-04对象并使用它。这样做的原因是,如果日期被共享,你会以不可预测的方式更新另一个对象的日期,这个问题称为走样(aliasing)",并区分"数据类型和值对象不是一个东西,数据类型不能有标识"。
- 原始内容:值对象应该是不可变的……你应该创建一个新的2-Jan-04对象并使用它。这样做的原因是,如果日期被共享,你会以不可预测的方式更新另一个对象的日期,这个问题称为走样(aliasing)……严格地说,数据类型和值对象不是一个东西,数据类型不能有标识。