重构——20将值对象改为引用对象(Change Value to Reference)

将值对象改为引用对象(Change Value to Reference)

你从一个类衍生出许多彼此相等的实例,希望将它们替换为同一对象;将这个值对象变成引用对象

一、动机

1、系统中的对象可以分为引用对象和值对象,有时候,你会从一个简单的值对象开始,在其中保存少量的不可修改的数据。而后,你可能会希望给这个对象加入一些可修改数据,并确保对任何一个对象的修改都能影响到所有引用此一对象的地方,这时候,你就希望将这个对象变为一个引用对象

2、值对象和引用对象,不可变对象

3、引用对象每个对象代表真实世界的一个实物,你可以直接以“==”检查两个对象是否相等。

4、值对象像是“钱”、“日期”这样的东西,它们完全由其所含的数据值来定义,你并不在意副本的存在。

二、做法

1、使用Replace Constructor with Factory Method

2、编译,测试

3、决定由什么对象负责提供访问新对象的途径

4、决定这些引用对象应该预先创建好,或者是应该动态创建

5、修改工厂函数,令它返回引用对象

6、编译,测试

时间: 2024-07-29 17:52:06

重构——20将值对象改为引用对象(Change Value to Reference)的相关文章

当弱引用对象成为集合元素时

当我们在系统用到某些占用内存较多的大对象,且该对象并不会被频繁使用(例如缓存场景)时,若考虑性能因素,或许我们可以选择使用弱引用(WeakReference)对象.弱引用对象就像是对象之中的"无间行者",行走于"活动"与"非活动"状态之间.即使该对象存在引用,垃圾回收器仍然可以对其进行回收,这使得我们对该对象的调用始终存在一种不可预知性,除非我们通过Target属性赋给对象,以创建强引用,否则我们始终处于这种忧虑之中.这让我们常常感到左右为难,但

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

将引用对象改为值对象(Change Reference to Value) 你有一个引用对象,很小且不可改变,而且不容易管理:将它变为一个值对象 一.动机 1.引用对象变得难以使用,就把它变改为值对象 2.值对象有一个非常重要的特性,它们应该是不可变的 二.做法 1.检查重构目标是否为不可变对象,或是否可修改为不可变对象 2.建立equals()和hashcode()方法 3.编译,测试 4.考虑是否可以删除工厂函数,并将构造函数声明为public

在JSP页面获取后台action封装的参数,这个参数里面又含有两个对象,二层引用,报错

问题描述 在JSP页面获取后台action封装的参数,这个参数里面又含有两个对象,二层引用,报错 javax.el.PropertyNotFoundException: Property 'userAccount' not found on type java.lang.String 上面是报错信息, 下面是JSP页面: 用户名: ${commentlist.userAccount.userName } 职业: ${commentlist.userAccount.job } ${commentl

使用NSHashTable存储引用对象

NSHashTable       我们使用集合(NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSSet,NSMutableSet)存储对象时会对其强引用(你可以使用单例的集合存储数据试一下咯),有时候我们不想这样子,怎么办呢?         那就使用NSHashTable这个集合吧,它的使用方法与NSSet完全相似,不同的是,它的一种初始化方式是weakObjectsHashTable,专门用来存储弱引用对象,不会持有它,那

【C/C++学院】0820-Nullptr/const对象/类指针引用以及mallocfree与newde/类重载运算符/QT加法重载/类的重载赋值运算/自增在前在后差别/赋值重载深浅拷贝/重载下标

Nullptr #include<iostream> void go(int num) { std::cout << "gonum" << std::endl; } void go(void *p) { std::cout << "gop" << std::endl; } void main() { //void *p = nullptr; void *p = NULL;//C++是强类型,严格的类型检查

工厂函数-$()方法的返回值一定是一个jquery对象吗?

问题描述 $()方法的返回值一定是一个jquery对象吗? 请教大虾,"$()方法的返回值一定是一个jquery对象",这句话是对的还是错的呢?请说明原因,谢谢 解决方案 其实$()可以包含两个参数,$(selectorcontext) selector:用来查找的字符串context:指定查找的位置,context不写默认情况下是在当前的 HTML document中查找 DOM 元素,无论如何$()返回的一定是个DOM对象. 解决方案二: 如果引了JQuery可以认为是,如果没有引

设计一个不强引用对象的单例字典

设计一个不强引用对象的单例字典 大家都知道,使用NSDictionary存储对象的时候会强引用对象,导致被存储对象的引用计数+1,有时候,我们想用单例来存储对象,但又不希望强引用存储的对象,这该怎么实现呢? 在这里,我们可以使用NSMapTable来实现这个功能. 我直接给出源码: WeakDictionary.h   +   WeakDictionary.m // // WeakDictionary.h // 弱引用字典 // // http://www.cnblogs.com/YouXian

java数据-java中键值对数据类型属于引用数据类型吗

问题描述 java中键值对数据类型属于引用数据类型吗 java中键值对数据类型属于引用数据类型吗,可以进行加减乘除操作吗 解决方案 你说像 Map接口的子类?这类引用类型的对象是不能直接进行加减乘除的.能进行加减乘除的只有基本类型和基本类型的包装类.当然如果你Map里放的值是基本类型,比如 Map对象map.put("key",1); 这样的存储你是可以通过 map.get("key") 获取 键值对的值,再对键值对的值进行运算的.但不能对map进行直接运算 解决方

C++中对象的常引用、动态建立和释放相关知识讲解_C 语言

C++对象的常引用 我们知道,一个变量的引用就是变量的别名.实质上,变量名和引用名都指向同一段内存单元. 如果形参为变量的引用名,实参为变量名,则在调用函数进行虚实结合时,并不是为形参另外开辟一个存储空间(常称为建立实参的一个拷贝), 而是把实参变量的地址传给形参(引用名),这样引用名也指向实参变量. [例] 对象的常引用. #include <iostream> using namespace std; class Time { public: Time(int,int,int); int