什么是防御式拷贝
关于防御式拷贝,主要的思路就是创建一个跟原来的对象一模一样的对象,并且这个新的对象不会受到原来对象的影响,也就是说它们是完全独立的。这里主要以List和Date这两个典型的mutable类型进行举例。
关于防御式拷贝的一点思考
当我们需要对类中rep里的集合Set(或者List,Map)进行读取,或者修改时,通常会采用这样的方式
1.读取
2.修改
思考
通常来讲,我们通过这样的方式来,防御式拷贝是没有问题的,但是当Person是一个可变类型时,还是有可能造成表示泄露。如下图
在这种情况下,建议对其进行深拷贝,也就是不断地向下拷贝,知道基础数据类型或者不可变类型为止。
我们可以做出如下修改
此时再次运行,可以看到,不会造成表示泄露
另外我们还可以对Perosn做出一点修改,(这种方式也适用于其他可变类型,同时还可以减少ClassRoom这种类中的代码量)
这种方式看似没什么区别,但是当在ClassRoom中进行了大量的防御式拷贝时,节省的代码量还是比较可观的。
总结
防御式拷贝时,应该注意对可变类型的深拷贝