Menu
Coddy logo textTech

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 する必要があります。

challenge icon

チャレンジ

簡単

オブジェクトの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にCloneable interfaceを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します。

    1. Original: に続けてOriginal documentのtoString()
    2. Clone: に続けてcloned documentのtoString()
    3. 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したことを証明しています。

REQUIRED OUTPUT FORMAT: [Your translated content here]

自分で試してみよう

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 かを確認)
        
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Javaオンラインコンパイラ