Javaでcloneメソッドを使用の方法
Javaでは、Cloneableインターフェースを実装してclone()メソッドをオーバーライドすることで、オブジェクトのクローンを作成できます。手順は以下のとおりです。
- はじめに、 клонирование を行う必要のあるクラスにCloneableインタフェースを実装します。Cloneableインタフェースは、そのほかにメソッドを持たないマーカーインタフェースです。
public class MyClass implements Cloneable {
// 类的内容
}
- クラスの中で、クローン()メソッドをオーバーライドします。クローンを実現するには、Objectクラスのクローン()メソッドを呼び出して型変換を行います。
public class MyClass implements Cloneable {
// 类的内容
@Override
public Object clone() throws CloneNotSupportedException {
return (MyClass) super.clone();
}
}
- 他所でclone()メソッドを使用して複製します。
MyClass obj1 = new MyClass();
try {
MyClass obj2 = (MyClass) obj1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
clone() メソッドの実装上、留意事項がいくつかあります。
- 複製可能にするインターフェースがクラスに実装されていなければ、CloneNotSupportedException が発生します。
- clone()メソッドの返り値はObject型なので、型変換が必要である。
- clone()メソッド内でsuper.clone()メソッドを呼び出すと、オブジェクトのシャローコピーが実装されます。ディープコピーを実装する場合は、参照型のプロパティについても個別に複製する必要があります。
- 不変オブジェクト(String など)を含む場合、浅コピーで十分です。オブジェクトは変更不可なので。
オブジェクトのクローンを作成するためのclone()メソッドの使用には、以下のような問題が生じる可能性があることに注意してください。
- Objectクラスのclone()メソッドはシャローコピーであり、オブジェクトの参照のみが複製され、オブジェクトの内容は複製されません。オブジェクトに参照型の属性がある場合、複製後、2つのオブジェクトは同じ参照を共有し、一方のオブジェクトの属性を変更すると、もう一方のオブジェクトに影響を与える可能性があります。
- clone()メソッドはprotectedメソッドのため、クラス内でしか呼び出せません。他のクラスでクローンを作成する場合はCloneableインタフェースを実装し、clone()メソッドをオーバーライドすれば可能です。
したがって、実際の開発では、コピーコンストラクタの使用、オブジェクトのシリアル化・デシリアライズの実施など、ほかの方法でオブジェクトのクローンを実現することを推奨します。