现在的位置: 首页 > 综合 > 正文

重构手法21:Change Reference to Value (将引用对象改为值对象)

2013年06月15日 ⁄ 综合 ⁄ 共 747字 ⁄ 字号 评论关闭

 

你有一个引用对象,很小且不可变,而且不易管理。将它变成一个值对象。

动机:要在引用对象和值对象之间做选择,有时并不容易。做出选择后,你常会需要一条回头路,

       如果引用对象开始变得难以使用,也许就应该将它改为值对象。引用对象必须被某种方式控制,你总是必须向其控制者请求适当的引用对象。它们可能造成内存区域之间错综复杂的关联。在分布式和并发系统中,不可变的值对象特别有用,因为你无需考虑它们的同步问题。

       值对象有一个非常重要的特征:它们应该是不可变的。无论何时,只有你调用同一对象的同一个查询函数,都应该得到同样结果。如果保证了这一点,就可以放心地以多个对象表示同一个事物。如果值对象是可变的,你就必须确保某个对象的修改会自动更新其他“代表相同事物”的对象。与其如此还不如把它变成引用对象。

       澄清下“不可变”(immutable)的意思:如果你以money类表示“钱’的概念,其中有”币种“和”金额“2条信息。那么Money对象通常是一个不可变的值对象。这并非意味你的薪资不能改变,而是意味:如果要改变你的薪资,就需要使用另一个Money对象来取代现有的Money对象,而不是在现有的Money对象上修改。你和Money对象之间的关系可以改变,但Money对象自身不能改变。

做法:1、检查重构目标是否为不可对象,或是否可修改为不可变对象。如果该对象目前还不是不可变的,就使用 Remove Setting Method (移除设置函数),直到它成为不可变的为止。如果无法将该对象修改为不可变的,就放弃使用本项重构。

       2、建立equals()和hashCode()。

       3、编译、测试。

       4、考虑是否可以删除工厂函数,并将构造函数声明为public。

 

抱歉!评论已关闭.