Java でオブジェクトをクローンする

Aryan Tyagi 2023年10月12日
  1. Java で直接法を使用してオブジェクトのクローンを作成する
  2. Java で clone() 関数を使用してオブジェクトのクローンを作成する
  3. Java でコピーコンストラクタを使用してオブジェクトのクローンを作成する
Java でオブジェクトをクローンする

オブジェクトの複製は、オブジェクトの正確な複製を作成するための手法です。現在のオブジェクトのクラスの新しいインスタンスを作成し、そのすべてのフィールドに現在のオブジェクトのフィールドの正確な内容を入力します。

このチュートリアルでは、Java でオブジェクトのクローンを作成します。

Java で直接法を使用してオブジェクトのクローンを作成する

このメソッドでは、新しいオブジェクトを作成し、以前に定義したオブジェクトをその値として割り当てます。

次の例を参照してください。

public class shallowcopy implements Cloneable {
  int a, b;

  public static void main(String args[]) throws CloneNotSupportedException {
    shallowcopy d = new shallowcopy();
    d.a = 10;
    d.b = 12;
    shallowcopy dtwo = d;

    System.out.println("Original " + d.a);
    System.out.println(d.b);
    System.out.println("Shallow Copy " + dtwo.a);
    System.out.println(dtwo.b);
    d.a = 5;
    System.out.println("Copy after modifying original");
    System.out.println(dtwo.a);
  }
}

出力:

Original 10
12
Shallow Copy 10
12
Copy after modifying original
5

上記のコードでは、オリジナルを変更し、作成されたコピーに変更が反映されていることを確認しました。このようなクローンは、シャローコピーと呼ばれます。

同じクラスの新しいインスタンスを返す前に、浅いコピーは同じクラスの新しいインスタンスを生成し、そのフィールドをコピーします。この手順では、オブジェクトの内容が新しいオブジェクトに転送されます。ただし、両方のオブジェクトが同じ値を参照するため、リンクされたオブジェクトに加えられた変更は他のオブジェクトに反映されます。オブジェクトクラスには、クローン機能と浅いコピー機能があります。オブジェクトクラスには、クローン機能と浅いコピー機能があります。

Java で clone() 関数を使用してオブジェクトのクローンを作成する

オブジェクトのクローンを作成するには、Object クラスの clone() メソッドを使用します。これは、配列を複製する最も簡単な方法です。

オブジェクトクローンを生成するクラスは、Cloneable インターフェイスを実装する必要があります。Cloneable インターフェースが実装されていない場合、clone() 関数は CloneNotSupportedException をスローします。

clone() 関数を使用すると、オブジェクトの正確なレプリカを作成するときに追加の処理を行う必要がなくなります。new を使用して行うと、処理に時間がかかるため、代わりにオブジェクトのクローンを使用します。これを使用して、ディープコピーを作成します。

アイテムが参照するオブジェクトと一緒に複製される場合、それはディープコピーと呼ばれます。コピーに加えられた変更は、オリジナルには反映されません。

例えば、

import java.util.ArrayList;
public class deepcopy implements Cloneable {
  int a, b;

  public Object clone() throws CloneNotSupportedException {
    return (deepcopy) super.clone();
  }
  public static void main(String args[]) throws CloneNotSupportedException {
    deepcopy d = new deepcopy();
    d.a = 10;
    d.b = 12;
    System.out.println("Original " + d.a);
    System.out.println(d.b);
    deepcopy dtwo = (deepcopy) d.clone();
    System.out.println("Deep Copy " + dtwo.a);
    System.out.println(dtwo.b);
    d.a = 5;
    System.out.println("Copy after modifying original");
    System.out.println(dtwo.a);
  }
}

出力:

Original 10
12
Deep Copy 10
12
Copy after modifying original
10

上記の例では、オリジナルに加えられた変更はディープコピーに反映されていません。

Java でコピーコンストラクタを使用してオブジェクトのクローンを作成する

コンストラクターは、あるクラスのオブジェクトを初期化します。コピーコンストラクタは、あるクラスの重複オブジェクトを作成できます。

このようなクラスを初期化する方法については、以下のコードを参照してください。

class copycon {
  public String cc;
  public copycon(String s) {
    this.cc = s;
  }
  public copycon(copycon different) {
    this.cc = different.cc; // copy constructor
  }
}
class Main {
  public static void main(String args[]) {
    copycon c1 = new copycon("abc");
    copycon c2 = new copycon(c1);
    System.out.println(c2.cc);
  }
}

出力:

abc

これでは、Java でのディープクローニングは実現されません。

関連記事 - Java Object