Kotlin Academy · レッスン

copy()と部分的なオーバーライドによるコピー

copy()を使い、元のインスタンスを変更せずに内容を変更したインスタンスを作成します。

レッスン 2/413 ステップ

「copy()と部分的なオーバーライドによるコピー」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

copy() によるイミュータブルな更新

copy()は、一部のプロパティを変更したデータクラスの新しいインスタンスを作成します。指定しなかったプロパティには元の値がそのまま保持されます。

copy() の基本

名前付き引数を渡して、特定のプロパティを上書きします。
data class Person(val name: String, val age: Int, val city: String)
val alice = Person("Alice", 30, "Berlin")
val olderAlice = alice.copy(age = 31)
println(olderAlice)  // Person(name=Alice, age=31, city=Berlin)

複数フィールドのコピー

必要な数だけフィールドを上書きできます。
data class Config(val host: String, val port: Int, val ssl: Boolean, val timeout: Int)
val prod = Config("prod.server", 443, true, 30)
val test = prod.copy(host = "test.server", port = 8080, ssl = false)
println(test)

copy は元のオブジェクトを変更しない

copyは常に新しいオブジェクトを作成します。元のオブジェクトはまったく変更されません。
data class Point(val x: Int, val y: Int)
val origin = Point(0, 0)
val moved = origin.copy(x = 5)
println(origin)  // Point(x=0, y=0) — unchanged
println(moved)   // Point(x=5, y=0)

ディープコピーに関する注意

copyはシャローコピーです。データクラス内の可変オブジェクトは、元のオブジェクトとコピーの間で共有されます。
data class Team(val name: String, val members: MutableList<String>)
val t1 = Team("A", mutableListOf("Alice"))
val t2 = t1.copy(name = "B")
t2.members.add("Bob")       // modifies SHARED list!
println(t1.members)  // [Alice, Bob] ← also changed!

シャローコピーの問題を避ける

共有による問題を避けるには、データクラス内でイミュータブルなデータを使用します。
data class Team(val name: String, val members: List<String>)  // immutable list
val t1 = Team("A", listOf("Alice"))
val t2 = t1.copy(name = "B", members = t1.members + "Bob")
println(t1.members)  // [Alice]
println(t2.members)  // [Alice, Bob]

状態管理での copy

copyは、Redux 形式や MVI アーキテクチャーで状態を更新するための慣用的な方法です。
data class UiState(val loading: Boolean, val items: List<String>, val error: String?)
fun reduce(state: UiState, action: Action) = when (action) {
    is Loading -> state.copy(loading = true)
    is Success -> state.copy(loading = false, items = action.data)
    is Error -> state.copy(loading = false, error = action.msg)
}

デフォルトパラメーターと copy

プロパティが多いデータクラスでも、名前付き引数によって copy を使いやすく利用できます。
data class Article(
    val id: Long, val title: String, val body: String,
    val published: Boolean = false, val views: Int = 0
)
val draft = Article(1L, "Hello", "Content...")
val published = draft.copy(published = true)
println(published.title)  // Hello

テストで copy を使う

copyを使うとテストフィクスチャを簡単に作成できます。1つの基本オブジェクトを用意し、必要なフィールドだけを変えられます。
val baseUser = User(id = 1, name = "Test", email = "test@test.com", active = true)
val inactiveUser = baseUser.copy(active = false)
val renamed = baseUser.copy(name = "Renamed")

copy と Builder パターンの比較

データクラスの copy()は、Kotlin における Builder パターンへの回答です。オプションのフィールドが多い複雑なオブジェクトでは、data class と copy の組み合わせのほうが簡潔です。
// Java Builder:
User.builder().name("A").age(30).role("admin").build()
// Kotlin:
val u = User("A", 30, "admin")  // or copy from base

レコードのセマンティクス

val プロパティを持つデータクラスは、Java のレコード(JDK 16 以降)のように動作します。イミュータブルで値ベースであり、自動的に表示可能です。
data class RGB(val r: Int, val g: Int, val b: Int)
val white = RGB(255, 255, 255)
println(white)  // RGB(r=255, g=255, b=255)

クイックチェック

データクラスのインスタンスに対して copy()を呼び出すと、元のインスタンスはどうなりますか?

まとめ

copy()はフィールドを上書きした新しいインスタンスを作成し、元のインスタンスは変更しません。状態管理、テスト、Builder パターン形式のインスタンス生成に適しています。ただし、可変プロパティのシャローコピーには注意してください。次は分解宣言です。
無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「copy()と部分的なオーバーライドによるコピー」レッスンは無料ですか?

はい。「copy()と部分的なオーバーライドによるコピー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「copy()と部分的なオーバーライドによるコピー」で何を学びますか?

copy()を使い、元のインスタンスを変更せずに内容を変更したインスタンスを作成します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「copy()と部分的なオーバーライドによるコピー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Data Classの基本:自動生成されるメソッド
  2. copy()と部分的なオーバーライドによるコピー
  3. componentNによる分割代入宣言
  4. コレクションとMapキーで使うData Class
← Kotlin Academyに戻る