別のオプションは、例えば、ソースオブジェクトにコピーする方法を実装することです:
interface Has3DCoords {
void setLocation(double x, double y, double z);
void copyCoordsTo(Has3DCoords dest);
}
あなたは、その後のようなコードの切れ端でコピーを実装します:
class Thing implements Has3DCoords {
private Point3D loc;
// ...
void setLocation(double x, double y, double z) {
loc.setLocation(x, y, z);
// or: loc = new Point3D(x, y, z);
}
void copyCoordsTo(Has3DCoords dest) {
loc.copyCoordsTo(dest);
// or: dest.setLocation(loc.getX(), loc.getY(), loc.getZ());
}
OtherThing createOtherThing() {
OtherThing result = new OtherThing();
this.copyCoordsTo(result);
return result;
}
}
これをすることができ次の場合に便利です:
- オブジェクト全体を複製するのは意味がありませんそう頻繁に一つのユニットとしてコピーされ、関連するプロパティのグループがあり
- は
- あなたは
Thing
- プロパティの数が多いのプロパティとして
loc
を公開したくない(または多くのそのようなグループがあります)それらのすべてをパラメータとして必要とするコンストラクタは扱いにくいでしょう。
なぜあなたはclone()とCloneableを避けたいですか? –
@Thomas Owens、ここをクリックしてください。http://www.artima.com/intv/bloch13.html – Yishai
解決策としてコピーコンストラクタを回答すると、コピーコンストラクタはすべてのケースを適切に処理しません。例えば、あなたが具体的なクラスを知らないとき(ただし、あなたはまだクローン/コピー/ whateveryoucallitメソッドの中でコピーコンストラクタを使うことができます)。 –