在创建值类型实例时,应该尽可能将其实现为具有常量性和原子性,所谓常量性,就是说对象在创建后就不会被改变,类似于我们在程序中定义的常量,这种形式的值类型只要被创建好后,就可以认为它的状态一直是不变的,这样它就是线程安全的。
原子性是指值类型中某些具有关联关系的字段,例如生日和年龄,年龄是根据生日计算得来的,如果对象的使用方只是修改年龄,而不修改生日,那么这样的结果显然是错误的。具有原子性的类型都是单一的实体,我们需要同时对相关联的字段进行维护。
关于如何构建常量型的值类型,可以分为以下两个步骤:1)将类型中的私有字段声明为readonly;2)将类型中的属性,设置为只读,即将属性的set方法删除。
需要注意的是,在将值类型转换为常量型的过程中,所谓的常量,是指针对在“堆栈”中存储的数据,对于在”堆“中存储的数据来说,单纯使用readonly设置是不够的,这里的”常量“只是说明指向”堆“中的内存地址是不会改变的,我们可以通过其他方式改变对应内存中的值。为了解决这个问题,我们需要对”堆“中的数据进行防御性复制。
关于如何初始化常量类型,通常有三种方式:
- 提供一个合适的构造函数集合。
- 通过工厂方法进行创建。
- 提供一个Helper类。