前言
防御性复制是十分有用的一个思想。
一、为什么需要防御性复制
用户可能毁坏不变性(可能是有意的,也可能是无意的)。
确保类不变量在任何输入下都有效,以最小化可变性。
二、如何使用防御性复制
下面以一个例子介绍如何使用防御性复制。
1.源程序
代码如下:
public class A {
private Date b;
public A(Date b) {
this.b = b;
}
public Date getb() {
return b;
}
如果我们进行如下操作:
public static void main(String[] args) {
A p = new A(new Date(2002, 1, 1));
System.out.println(p.getb().getYear());
Date c = p.getb();
c.setYear(2022);
System.out.println(p.getb().getYear());
}
我们会发现输出如下:
2002
2022
这是由于Date类是可变的。
对于类似于Date的这种可变类,对其进行引用时都有可能发生修改。
2.修改后的代码
对于上述代码,我们的修改方法就是使用防御性复制。
public class A {
private Date b;
public A(Date b) {
this.b = b;
}
public Date getb() {
return new Date(b.toString()); //防御性复制
}
}
总结
如果类具有从客户端得到或者返回到客户端的可变对象,类就必须防御性的复制这些对象。