Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのオブジェクトクローン(clone)とは?使い方と注意点をわかりやすく解説

オブジェクトクローンとは

オブジェクトクローンとは、既存のオブジェクトの完全なコピーを作成するための仕組みです。コピーを作成する際には、Objectクラスが提供するclone()メソッドを使用します。

ただし、clone()メソッドを使ってオブジェクトを複製するクラスは、Cloneableインターフェースを実装している必要があります。実装していない状態でclone()メソッドを呼び出すと、CloneNotSupportedExceptionがスローされるため注意が必要です。

オブジェクトクローンを利用する大きなメリットは、処理コストの削減です。newキーワードで新しいオブジェクトを生成して同じ内容を一から組み立てる場合、すべてのフィールドに値を設定し直す必要があり、多くの処理が発生します。一方、clone()メソッドなら既存オブジェクトの状態をそのまま複製できるため、余分な処理を省くことができます。

構文

protected Object clone() throws CloneNotSupportedException

clone()メソッドはObjectクラス内でprotectedとして宣言されているため、通常はサブクラスでオーバーライドし、外部から呼び出せる形に公開します。

使用例

次の例では、EmployeeクラスにCloneableインターフェースを実装し、オブジェクトの複製を作成しています。

public class Employee implements Cloneable {
    int id;
    String name = "";

    public Employee(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public Employee clone() throws CloneNotSupportedException {
        return (Employee) super.clone();
    }

    public static void main(String[] args) {
        Employee emp = new Employee(115, "Raja");
        System.out.println(emp.name);

        try {
            Employee emp1 = emp.clone();
            System.out.println(emp1.name);
        } catch (CloneNotSupportedException cnse) {
            cnse.printStackTrace();
        }
    }
}

実行結果

Raja
Raja

emp.clone()を呼び出すことで、元のオブジェクトと同じ値を持つ新しいインスタンスが生成され、同じ結果が出力されます。

注意点:浅いコピー(シャローコピー)

clone()メソッドによる複製はデフォルトで浅いコピーです。つまり、プリミティブ型のフィールドは値ごとコピーされますが、参照型のフィールドは参照先が共有されます。可変なオブジェクトをフィールドに持つ場合は、ディープコピー(深いコピー)を独自に実装するか、コピーコンストラクタやシリアライズを活用する方法も検討するとよいでしょう。

  1. JavaのStrictMathクラスとは?主なメソッドと使い方を解説

    java.lang.StrictMathはfinalクラスであり、Objectクラスのサブクラスです。このクラスには、指数関数・対数関数・平方根や三角関数といった初等的な数値演算を実行するためのメソッドが多数含まれています。 StrictMathクラスのすべてのメソッドはstaticメソッド(静的メソッド)として定義されているため、インスタンスを生成する必要はありません。クラス名を直接指定してメソッドを呼び出すだけで利用できます。 主なメソッド一覧 StrictMathクラスでよく使われるメソッドには以下のようなものがあります。 abs():絶対値を返す acos() / asin()

  2. JavaのsetBounds()メソッドとは?使い方とサンプルコードを解説

    JavaのGUIプログラミングでは、レイアウトマネージャー(Layout Manager)がコンポーネントの位置やサイズを自動的に決定します。しかし、レイアウトマネージャーを使用しない場合は、コンポーネントの位置とサイズを手動で設定する必要があります。そのような場面で活躍するのがsetBounds()メソッドです。フレームのレイアウトマネージャーをnullに設定することで、コンポーネントの位置とサイズを自由に指定できるようになります。setBounds()メソッドの基本setBounds()メソッドは4つの引数を取ります。第1引数と第2引数はコンポーネントの左上隅のx座標・y座標、第3引数はコ