clone() メソッド
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 43/87。
clone()メソッドはオブジェクトのコピーを作成します。これを使用するには、クラスでCloneableインターフェースをimplementし、Objectクラスのclone()メソッドをOverrideする必要があります。
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Person clone() {
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}これで、オブジェクトの独立したコピーを作成できます。
Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy は同じ値を持つ別個のオブジェクトですデフォルトでは、clone() は浅いコピーを実行します。つまり、プリミティブ値と参照をコピーします。object に fields として他の object が含まれている場合、original と cloned はどちらも同じネストされた object を参照します。ネストされた object を含む完全に独立したコピーを作成するには、clone() method 内でそれらのネストされた object も複製して、深いコピーを implement する必要があります。
チャレンジ
簡単オブジェクトのcloneを示すdocument management systemを構築しましょう。独立したcopyを作成するためにcloneできるDocument classを作成し、Originalをそのまま保持しながらユーザーがdocumentを複製できるようにします。
コードを2つのファイルに分けて構成します。
Document.java:cloneをサポートするdocumentを表すclassをCreateします。Documentには3つのprivate fieldsがあります。title(String)、author(String)、version(int)です。すべてのfieldsを初期化するconstructorと、それぞれのgetter methodsを含めます。また、version numberを更新するsetVersion(int version)methodも追加します。Document classに
Cloneableinterfaceをimplementさせ、clone()methodをOverrideしてDocumentを返すようにします。method内でCloneNotSupportedExceptionを処理し、RuntimeExceptionでラップします。toString()をOverrideして、次を返すようにします:Document[title=X, author=Y, version=Z]。ここでX、Y、Zは実際のfield valuesです。Main.java:Document classをCreateしてcloneすることで、実際に動作させます。3つのinputsを受け取ります:title(String)、author(String)、version number(int)です。これらのvaluesを使用してOriginal DocumentをCreateし、その後cloneしてcopyをCreateします。cloneの後、
setVersion()を使用してcopyのversionを1 incrementingしてModifyします。これにより、cloneがOriginalから本当にIndependentであることを示します。3行をPrintします。
Original:に続けてOriginal documentのtoString()Clone:に続けてcloned documentのtoString()Independent:に続けてtrueまたはfalseをPrintします。これはOriginalとcloneが異なるobjectsであるかどうかを示します(!=comparisonを使用)
3つのinputsを受け取ります:document title(String)、author name(String)、version number(int)です。
cloneのversionをModifyした後も、Original documentが変更されないことに注目してください。これは、clone()が本当にIndependentなcopyをCreateしたことを証明しています。
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 入力を読み取る
String title = scanner.nextLine();
String author = scanner.nextLine();
int version = scanner.nextInt();
// TODO: 入力値でオリジナルのDocumentを作成する
// TODO: オリジナルのドキュメントをクローンしてコピーを作成する
// TODO: クローンのversionを1増やして変更する
// TODO: "Original: " に続いてオリジナルのドキュメントを出力する
// TODO: "Clone: " に続いてクローンされたドキュメントを出力する
// TODO: "Independent: " に続いて true/false を出力する(original != clone かを確認)
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造7特殊メソッドとObjectクラス
toString() メソッドequals() と hashCode()clone() メソッドcompareTo() と ComparableComparator インターフェースまとめ - カスタムソート自分で練習してみよう: Javaオンラインコンパイラ