Kotlinでオブジェクトをクローン

David Mbochi Njonge 2023年6月20日
  1. Kotlin プロジェクトを生成する
  2. データ クラスの copy() メソッドを使用して、Kotlin でオブジェクトを複製する
  3. ArrayList の clone() メソッドを使用して、Kotlin でオブジェクトを複製する
  4. Kotlin でオブジェクトを複製する拡張関数を作成する
  5. Kotlin でオブジェクトを複製するための複製可能なインターフェイスを実装する
  6. まとめ
Kotlinでオブジェクトをクローン

複製機能は通常、オブジェクト指向プログラミング言語で使用されます。 複製は、オブジェクトのコピーを作成することとして定義されます。つまり、コピーされたオブジェクトには、元のオブジェクトとまったく同じプロパティとメソッドが含まれます。

オブジェクトをコピーすると、オブジェクトを作成してヒープに追加するプロセス全体を実行せずに既存のオブジェクトを再利用できるため、リソースの浪費を回避するのに役立ちます。

このチュートリアルでは、オブジェクトのコピーまたはクローンを作成するために活用できるさまざまなアプローチについて説明します。

Kotlin プロジェクトを生成する

IntelliJ 開発環境に移動し、File>New>Project を選択します。 プロジェクト名をkotlin-copy-objectと入力し、言語セクションでKotlinを選択し、ビルド システムセクションでIntellijを選択します。

src/main/kotlin フォルダーの下に Main.kt という名前のファイルを作成します。 次のコードをコピーしてファイルに貼り付けます。

data class Movie(var id: Int,
                 var name: String,
                 var genre: String,
                 var duration: Int);

fun fetchMovies(): ArrayList<Movie>{
    return arrayListOf(
        Movie(1,"Paws of fury","animation",60),
        Movie(2,"Green lantern","animation",80),
        Movie(3,"Hot seat","action",70),
        Movie(4,"Chip n Dale","fantasy",60),
        Movie(5,"Bullet train","mystery",80)
    );
}

このコードでは、Movie オブジェクトの ArrayList を返す fetchMovies() という名前のメソッドを作成しました。 ムービー オブジェクトは、このコードでも定義した データ クラス を使用して作成されます。

映画オブジェクトのプロパティには、idnamegenre、および期間が含まれます。 id プロパティは int 型で、その他のプロパティは string 型です。

このチュートリアルで取り上げるいくつかの例では、fetchMovies() メソッドを使用して、Kotlin でオブジェクトのコピーを作成する方法を示します。

データ クラスの copy() メソッドを使用して、Kotlin でオブジェクトを複製する

データ クラスは、データを一時的に保持するために使用されるクラスであり、開発者にすぐに使えるいくつかの機能を提供します。 データ クラスは、開発者がロジックを実装せずに活用できる次のメソッドを提供します: equals()hashCode()toString()、および copy()

fetchMovies() メソッドの後に、次のコードをコピーして Main.kt ファイルに貼り付けます。

fun usingCopyOnDataClass(){
    val movie: Movie = fetchMovies()[2];
    val copyOfMovie: Movie = movie.copy();
    println(copyOfMovie);
}

fun main(){
    usingCopyOnDataClass();
}

このコードでは、Movie オブジェクトの ArrayList を返す fetchMovies() メソッドを使用して、インデックス 2 の Movie オブジェクトを取得しています。

目的は、データ クラスによって提供される copy() メソッドを利用して、オブジェクトのコピーを作成することです。 データ クラスの copy() メソッドは、オブジェクトの同じコピーを提供します。

注: これを実現するために新しいオブジェクトは作成されません。

変更したいプロパティの値を copy() メソッドの引数として渡すことにより、残りを維持しながら、オブジェクトのプロパティの一部を変更することもできることに注意してください。

たとえば、引数 copy(name = "Avengers") を渡すと、オブジェクトの新しいコピーの名前が指定した名前に変更され、残りは変更されません。

このコードを実行して、出力が次のようになっていることを確認します。

Movie(id=3, name=Hot seat, genre=action, duration=70)

ArrayList の clone() メソッドを使用して、Kotlin でオブジェクトを複製する

前の例をコメントアウトし、次のコードをコピーして Main.kt ファイルのコメントの後に貼り付けます。

fun usingCloneWithArrayList(){
    @Suppress("UNCHECKED_CAST")
    val movies: ArrayList<Movie> =
        fetchMovies().clone() as ArrayList<Movie>;
    movies.forEach(::println);
}

fun main(){
    usingCloneWithArrayList();
}

このコードでは、fetchMovies() メソッドを使用して、返された ArrayList インスタンスのコピーを clone() メソッドを使用して作成しています。

ArrayList の clone() メソッドは Object クラスから継承されます。 このメソッドはリスト インスタンスを返します。つまり、要素はコピーされません。

clone() メソッドは Object を返すため、as キーワードを使用して ArrayList<Movie> にキャストしました。 このコードを実行して、出力が次のようになっていることを確認します。

Movie(id=1, name=Paws of fury, genre=animation, duration=60)
Movie(id=2, name=Green lantern, genre=animation, duration=80)
Movie(id=3, name=Hot seat, genre=action, duration=70)
Movie(id=4, name=Chip n Dale, genre=fantasy, duration=60)
Movie(id=5, name=Bullet train, genre=mystery, duration=80)

Kotlin でオブジェクトを複製する拡張関数を作成する

拡張関数は、基になるコードを変更せずに既存のクラスに機能を追加できるようにする関数です。 前のコードをコメントアウトし、次のコードをコピーして Main.kt ファイルのコメントの後に貼り付けます。

fun Movie.clone(): Movie{
    val movie = Movie(
        this.id,
        this.name,
        this.genre,
        this.duration);
    return movie;
}

fun usingCloneExtensionFunction(){
    val movie = fetchMovies()[4];
    val clonedMovie = movie.clone();
    println(clonedMovie);
}

fun main(){
    usingCloneExtensionFunction();
}

このコードでは、clone() という名前の Movie データ クラスの拡張関数を作成しました。 clone 拡張関数が呼び出されると、オブジェクトの現在のインスタンスが返されます。

clone() 拡張関数を使用するために、fetchMovies() メソッドを使用してインデックス 4 のムービーを取得し、clone() 関数を呼び出しました。 これにより、インデックス 4 のオブジェクトと同じオブジェクトのコピーが作成されます。

このコードを実行して、出力が次のようになっていることを確認します。

Movie(id=5, name=Bullet train, genre=mystery, duration=80)

Kotlin でオブジェクトを複製するための複製可能なインターフェイスを実装する

アプリケーションを開発していて、特定のクラスをコピーしたい場合、通常、Cloneable インターフェイスを実装することで、この機能をクラスに追加します。

Cloneable インターフェイスには、クラスの文字列表現を返す clone() という名前のメソッドがあります。 clone()toString() メソッドをオーバーライドするだけです。

clone() メソッドも public にする必要があることに注意してください。

前の例をコメントアウトし、次のコードをコピーして Main.kt ファイルのコメントの後に貼り付けます。

class Student(
    private val firstName: String,
    private val lastName: String): Cloneable{

   public override fun clone(): Any {
        return super.clone()
    }

    override fun toString(): String {
        return "Student(firstName='$firstName', lastName='$lastName')"
    }

}

fun implementingCloneable(){
    val student: Student = Student("john","doe");
    val clonedStudent = student.clone();
    println(clonedStudent.toString());
}

fun main(){
    implementingCloneable();
}

このコードでは、プロパティ firstNamelastName を持つ Student という名前のクラスを作成しました。 このクラスは Cloneable インターフェイスを実装し、その clone() メソッドをオーバーライドします。

また、複製されたオブジェクトをコンソールに記録できるように、toString() メソッドをオーバーライドしました。

implementingCloneable()Student オブジェクトのインスタンスを作成し、clone() メソッドを呼び出してオブジェクトのコピーを作成します。 このコードを実行して、出力が次のようになっていることを確認します。

Student(firstName='john', lastName='doe')

まとめ

このチュートリアルでは、Kotlin でオブジェクトのコピーを作成する方法を学びました。 これまで説明してきたアプローチには、data クラスの copy() メソッドの使用、ArrayList の clone() メソッドの採用、拡張関数の作成、および Cloneable インターフェースの使用が含まれます。

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

関連記事 - Kotlin Object