如果一个对象在构造之后状态不能改变,那么它就被认为是不可变的。对于创建简单、可靠的代码来说,最大程度地依赖于不可变对象是一种被广泛接受的合理策略
使用防御性复制创建类型的不可变版本
Java中的一些基本类型和类基本上是可变的。例如,所有数组类型都是可变的,像java.util.Data这样的类也是可变的。在强制使用不可变类型的情况下,这可能会很尴尬。
处理这个问题的一种方法是为可变类型创建一个不可变的包装器。下面是一个简单的整数数组包装器
public class ImmutableIntArray {
private final int[] array;
public ImmutableIntArray(int[] array) {
this.array = array.clone();
}
public int[] getValue() {
return this.clone();
}
}
此类通过使用防御性复制来分离可变状态(来自可能变异的任何代码的可变状态(INT []):
- 构造函数使用CLONE()来创建参数数组的不同副本。如果构造函数的调用者随后更改了参数数组,则不会影响immutableIntarray的状态。
- getValue()方法还使用CLONE()来创建返回的数组。如果来电者要更改结果数组,则不会影响immutableIntarray的状态。
我们还可以将方法添加到immutableIntarray上,以在包装数组上执行只读操作;例如获得其长度,获取特定索引处的值,等等。
注意:这种方式实现的不可变包装类型不与原始类型兼容。
你不能简单地替代前者的后者。
日期:2020-06-02 22:15:19 来源:oir作者:oir
