是否应该始终为传递给构造函数的可变对象的对象引用制作防御性副本?
如果是,那么我在制作副本时应该“深入”到什么程度。在下面的示例中,我应该在所有涉及的类的复制构造函数中进行深度复制吗?
例如:
class Graph {
AdjacencyList;
public Graph(Graph graph) {
this.list = graph.list; // shallow copy
OR
this.list = ArrayCopy(graph.list); // deep copy
}
}
class DFS implements GraphAlgo {
Graph g
DFS(Graph g) {
this.g = g; // shallow copy
OR
this.g = new Graph(graph) // deep copy
}
DFS(Algo algo) {
this.g = algo.g; // shallow copy
OR
this.g = new Graph(algo.g); // deep copy
}
}
class Algo {
GraphAlgo galgo
Algo (GraphAlgo dfsalgo) {
galgo = dfsalgo // shallow copy
OR
galgo = new DFSAlgo(dfsalgo); // deep copy
}
}
3.. 如果某些类忘记实现深拷贝怎么办?这是否意味着我永远不会有一个安全的深度复制对象?有什么办法可以防止这种情况?