Javaでcloneメソッドを使用の方法

Javaでは、Cloneableインターフェースを実装してclone()メソッドをオーバーライドすることで、オブジェクトのクローンを作成できます。手順は以下のとおりです。

  1. はじめに、 клонирование を行う必要のあるクラスにCloneableインタフェースを実装します。Cloneableインタフェースは、そのほかにメソッドを持たないマーカーインタフェースです。
public class MyClass implements Cloneable {
    // 类的内容
}
  1. クラスの中で、クローン()メソッドをオーバーライドします。クローンを実現するには、Objectクラスのクローン()メソッドを呼び出して型変換を行います。
public class MyClass implements Cloneable {
    // 类的内容

    @Override
    public Object clone() throws CloneNotSupportedException {
        return (MyClass) super.clone();
    }
}
  1. 他所でclone()メソッドを使用して複製します。
MyClass obj1 = new MyClass();
try {
    MyClass obj2 = (MyClass) obj1.clone();
} catch (CloneNotSupportedException e) {
    e.printStackTrace();
}

clone() メソッドの実装上、留意事項がいくつかあります。

  1. 複製可能にするインターフェースがクラスに実装されていなければ、CloneNotSupportedException が発生します。
  2. clone()メソッドの返り値はObject型なので、型変換が必要である。
  3. clone()メソッド内でsuper.clone()メソッドを呼び出すと、オブジェクトのシャローコピーが実装されます。ディープコピーを実装する場合は、参照型のプロパティについても個別に複製する必要があります。
  4. 不変オブジェクト(String など)を含む場合、浅コピーで十分です。オブジェクトは変更不可なので。

オブジェクトのクローンを作成するためのclone()メソッドの使用には、以下のような問題が生じる可能性があることに注意してください。

  1. Objectクラスのclone()メソッドはシャローコピーであり、オブジェクトの参照のみが複製され、オブジェクトの内容は複製されません。オブジェクトに参照型の属性がある場合、複製後、2つのオブジェクトは同じ参照を共有し、一方のオブジェクトの属性を変更すると、もう一方のオブジェクトに影響を与える可能性があります。
  2. clone()メソッドはprotectedメソッドのため、クラス内でしか呼び出せません。他のクラスでクローンを作成する場合はCloneableインタフェースを実装し、clone()メソッドをオーバーライドすれば可能です。

したがって、実際の開発では、コピーコンストラクタの使用、オブジェクトのシリアル化・デシリアライズの実施など、ほかの方法でオブジェクトのクローンを実現することを推奨します。

bannerAds