コンストラクタに渡される可変オブジェクトのオブジェクト参照に対して常に守備コピーを作成する必要がありますか?コンストラクタをコピーする深さはどれくらいですか
「はい」の場合、コピーを作成するにはどうすればよいですか。次の例では、関連するすべてのクラスのコピーコンストラクタ内に深いコピーを作成する必要がありますか?
例:
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 ..いくつかのクラスは深いコピーを実装するのを忘れた場合はどう?安全な深くコピーされたオブジェクトを決して持っていないことを意味しますか?これを防ぐ方法はありますか?
これを行うことを敢えてしないでください! http://stackoverflow.com/q/2156120/1065197 –
を参照してください。「不変性を好む」と表示されている場合は、このようなことを心配する必要はありません。 –