Javaその他

Cloneableインタフェースを使って独自クラスのオブジェクトのコピー(clone)を作成してみた

Javaで、ある変数が独自クラスのオブジェクトを参照しているとき、参照先の値が変更されると参照元の値も変更されてしまうが、Cloneableインターフェースを実装し、cloneメソッドをオーバーライドすることで、変更前の値をもつオブジェクトのコピーを取ることができる。

今回は、Cloneableインタフェースを使って独自クラスのオブジェクトのコピー(clone)を利用したサンプルプログラムを作成してみたので、共有する。

前提条件

下記記事の「IntelliJ IDEA上でSpring Bootプロジェクトの読み込み」まで完了していること。

IntelliJ IDEA上でGradleを使ってWeb画面のSpring Bootプロジェクトを作成してみたSpring Bootのプロジェクトを新規作成を「IntelliJ IDEA」のメニューから実施しようとしたところ、無料の「Commun...

サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、今回作成・変更したプログラムである。

「build.gradle」の内容は以下の通りで、lombokを利用するための設定を追加している。



Contractクラス・Userクラスの内容は以下の通りで、cloneメソッドによるオブジェクトのコピーを行えるようにするため、Cloneableインタフェースを実装し、cloneメソッドをオーバーライドしている。

メインクラスの内容は以下の通りで、user1を変更したときの、(user1を直接参照している)user2と、(user1をcloneした)user3の値の変化が見れるようにしている。



サンプルプログラムの実行結果

サンプルプログラム「DemoMain.java」を実行した結果は以下の通りで、赤枠のように、user1を変更すると、(user1を直接参照している)user2にはuser1の変更が反映されているが、(user1をcloneした)user3にはuser1の変更が反映されないことが確認できる。
サンプルプログラムの実行結果

要点まとめ

  • 変更前の独自クラスのオブジェクトのコピー(clone)を作成できるようにするには、Cloneableインタフェースを実装し、cloneメソッドをオーバーライドする。
  • 独自クラスにオブジェクトがメンバ変数に含まれている時は、親クラスのcloneメソッドを呼び出した後で、独自クラスのメンバ変数のcloneメソッドを呼び出し設定する必要がある。