6.4.7 不可变类
6.4.7 不可变类immutable
什么是不可变类
不可变类的意思是创建该类的实例后,该实例的实例变量是不可改变的。
Java中的不可变类
Java
提供的8个包装类和java.lang.String
类都是不可变类,当创建它们的实例后,其实例的实例变量不可改变。
如何自定义不可变类
- 使用
private
和final
修饰符来修饰该类的成员变量
。 - 提供带
参数构造器
,用于根据传入参数来初始化类里的成员变量。 - 仅为该类的成员变量提供
getter
方法,不要为该类的成员变量提供setter
方法,因为普通方法无法修改final
修饰的成员变量 - 如果有必要,重写
Object
类的hashCode()
和equals()
方法.equals()
方法根据关键成员变量
来作为两个对象是否相等的标准,- 还应该保证两个用
equals
方法判断为相等的对象的hashCode
也相等。
什么是可变类
可变类的含义是该类的实例变量是可变的。大部分时候所创建的类都是可变类,特别是JavaBean
,因为总是为其实例变量提供了setter
和getter
方法。
成员变量类型是可变类的情况
当使用final
修饰引用类型变量时,仅表示这个引用类型变量不可被重新赋值,但引用类型变量所指向的对象的成员变量值依然可改变。这就产生了一个问题:当创建不可变类时,如果它包含成员变量的类型是可变的,那么其对象的成员变量的值依然是可改变的,则这个类一人不是不可变类。
如果需要设计一个不可变类,尤其要注意其引用类型的成员变量,如果引用类型的成员变量的类是可变的,则要想办法让外界无法正确获取成员变量的引用.
当成员变量的类型是可变的的时候如何设计不可变类
- 在构造器中不要将可变类的参数直接赋值给成员变量,而是取出参数的值,然后再封装成新对象,再将这个新对象赋值给成员变量.
getter
方法中也不要直接返回成员变量对象,而是取出成员变量对象中的值,再封装成新的一个对象返回.
这样外界无法获取成员变量的引用,从而无法修改成员变量对象的值.从而保证这个类是真正的不可变类.
实例
1 | // 这是一个可变类 |
运行结果:
1 | 悟空 |