【Kotlin】Kotlin 2.4.20 完全ガイド — SwiftエクスポートとWasm対応

積み上がったコードバーと六角形のノードでコルーチンを表したKotlin 2.4.20のアイキャッチ画像

Kotlin 2.4.20のStackTraceRecoverableによるコルーチンのスタックトレース回復、allEqual/allDistinctでのコレクション同値チェック、SwiftエクスポートとWasm対応を実行結果で確認します。

目次

この記事が解決する悩み

  • アップデートで何が良くなるのか、要点だけ知りたい
  • コルーチンの例外でスタックトレースが追いづらい

対象読者: Kotlinでアプリやサーバーを書いている人
前提知識: コルーチンを使った経験があること

結論

Kotlin 2.4.20は2026年9月にリリースされた最新バージョンで、コルーチンのデバッグ体験を大きく改善するStackTraceRecoverableインターフェース、コレクション操作を大幅に簡略化するallDistinct()/allEqual()系統の新関数、Kotlin/NativeのSwiftエクスポート強化、そしてKotlin/WasmのWasmtime対応が目玉です。

標準ライブラリの追加としては、これが一番気になるはず。さっそく見てみましょう。

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    data class Response(val id: String, val answer: String)
    val responses = listOf(
        Response("P001", "Yes"),
        Response("P002", "Maybe"),
        Response("P003", "No")
    )
    // 全ての回答が同じか?
    println(responses.allEqualBy { it.answer })   // false
    // 参加者が全員ユニークか?
    println(responses.allDistinctBy { it.id })     // true
    // 回答が全て同じか?
    println(responses.map { it.answer }.allEqual())    // false
    // 回答が全て異なるか?
    println(responses.map { it.answer }.allDistinct()) // true
}

Kotlin 2.4.20 の主要変更点

まずは全体像を把握しましょう。2.4.20の変更点は以下の4つのカテゴリに分類できます。

カテゴリ 主な変更点 ステータス
標準ライブラリ StackTraceRecoverable、コレクション同値/ユニークチェック、kotlin.test拡張 Stable(一部Experimental)
Kotlin/Native Swiftエクスポート新機能、Package.swift自動生成、インクリメンタルコンパイル改善 Alpha〜Beta
Kotlin/Wasm Wasmtime対応、コンパニオンオブジェクト初期化順序改善、バリナリサイズ削減 Beta
Kotlin/JS ブラウザテスト用DSL、suspendラムダのasync関数エクスポート Experimental
ビルドツール Build Tools APIがJS/Wasm/Metadata対応、kotlinrネイティブイメージ Experimental

さらに、Kotlin Toolchain 0.12も同時期にリリースされ、マルチプラットフォームライブラリの公開とWasmアプリケーションのプレビューが追加されています。こちらも後ほど触れます。

コルーチンスタックトレース回復(StackTraceRecoverable)

これが個人的に一番の注目機能です。コルーチンを使っていると、非同期処理の中で例外が発生したときにスタックトレースが切れてしまい、「どこで例外が起きたのか」が追いにくい問題がありました。

kotlinx.coroutines はJVM上でスタックトレース回復という仕組みを持っていて、例外を再スローするときに元のスタックトレースを保持したコピーを作ってくれます。ただし、自動的にコピーを作れるのは「メッセージのみ」「原因のみ」「両方」「引数なし」のいずれかのコンストラクタを持つ例外クラスだけです。カスタム例外に追加の引数があると、コピーが作れませんでした。

Kotlin 2.4.20ではこの問題を解決するために、標準ライブラリに StackTraceRecoverable インターフェースが追加されました。kotlinx.coroutinesに依存せずに、自分の例外クラスでスタックトレース回復をサポートできます。

@OptIn(kotlin.coroutines.ExperimentalStdlibCoroutineSupportApi::class)
class BadResponseCodeException(val responseCode: Int)
    : Exception(), StackTraceRecoverable<BadResponseCodeException> {
    override fun copyForStackTraceRecovery(): BadResponseCodeException {
        val result = BadResponseCodeException(responseCode)
        result.initCause(this)
        return result
    }
}

実装のポイントは3つです。

  • StackTraceRecoverable<T> を実装する(Tは自身の型)
  • copyForStackTraceRecovery() で新しいインスタンスを返す
  • 元の例外を initCause() でcauseとして設定する(デバッグ性が向上)

このインターフェースは全プラットフォームで利用可能ですが、kotlinx.coroutines が実際にスタックトレース回復を行うのはJVMのみです。とはいえ、共通コードで例外クラスを定義しておけば、JVMで動かしたときに自動的に効果が発揮されます。

コレクションの同値・ユニークチェック関数

2.4.20では4つの新しい実験的関数が標準ライブラリに追加されました。これらは @OptIn(ExperimentalStdlibApi::class) が必要です。

関数 チェック内容
allDistinct() コレクション内のすべての要素がユニークか
allDistinctBy() 指定したプロパティの値がすべてユニークか
allEqual() コレクション内のすべての要素が同じ値か
allEqualBy() 指定したプロパティの値がすべて同じか

実際の動きを確認してみましょう。

@OptIn(ExperimentalStdlibApi::class)
fun main() {
    data class Order(val orderId: String, val customerId: String, val amount: Int, val status: String)
    val orders = listOf(
        Order("ORD-001", "C001", 12000, "shipped"),
        Order("ORD-002", "C001", 8000, "pending"),
        Order("ORD-003", "C002", 15000, "shipped"),
        Order("ORD-004", "C003", 12000, "cancelled")
    )
    println(orders.allDistinctBy { it.orderId })    // true
    println(orders.allDistinctBy { it.customerId })  // false
    println(orders.allEqualBy { it.status })         // false
    println(orders.allEqualBy { it.amount })         // false
    val statuses = orders.map { it.status }
    println(statuses.allEqual())    // false
    println(statuses.allDistinct()) // false
    println(listOf(1, 2, 3).allDistinct())  // true
    println(listOf(42, 42, 42).allEqual())  // true
}

これらの関数は Collection、Sequence、Array のすべてで使えます。内部実装は HashSet を使っているので、大規模コレクションでも効率的です。

今までのコードと比較してみましょう。

// Before
val allSame = responses.map { it.status }.distinct().size == 1
val allUnique = responses.map { it.id }.distinct().size == responses.size

// After
val allSame = responses.allEqualBy { it.status }
val allUnique = responses.allDistinctBy { it.id }

可読性が段違いですね。「何をチェックしているか」がメソッド名から一瞬で分かります。

実測メモ: allDistinct() と allEqual() は実験的なAPIなので、そのまま書くとコンパイルが止まります。Kotlin 2.4.20 で試したところ「this declaration needs opt-in」と言われたので、@OptIn(ExperimentalStdlibApi::class) を付けてください。クラスかファイル単位で一度書けば済みます。

Kotlin/Native: Swiftエクスポートの強化

Kotlin MultiplatformでiOSアプリを開発している人にとっては、今回のリリースで一番嬉しい変更かもしれません。

Package.swift の自動生成

これまでKotlin/Nativeの成果物をSwiftPMで利用するには、手動で Package.swift を書く必要がありました。2.4.20ではビルド時に自動生成されるようになり、SwiftPMの依存関係としてKotlin Multiplatformモジュールを直接宣言できるようになります。

kotlin {
    iosArm64()
    iosSimulatorArm64()
    swiftExport {
        packageName.set("MyKMPModule")
    }
}

sealed classのエクスポート対応

Kotlinの sealed class がSwiftのenumとして適切にエクスポートされるようになりました。代数的データ型をSwiftのパターンマッチングで扱えます。

sealed class ApiResult {
    data class Success(val data: String) : ApiResult()
    data class Error(val code: Int, val message: String) : ApiResult()
}

Kotlin/Wasm: Wasmtime対応と最適化

Kotlin/Wasmは引き続きBetaですが、2.4.20でいくつか改善が入っています。

  • Wasmtime対応: Kotlin Gradle Pluginから wasmWasi ターゲットのランタイムとしてWasmtimeを選択可能に
  • コンパニオンオブジェクト初期化順序: JVMの挙動に合わせるよう修正され、プラットフォーム間の一貫性が向上
  • バリナリサイズ削減: 関数型インターフェースのバイナリサイズが最適化
  • トップレベル require() の扱い変更: @JsFun 内での require() 呼び出しが適切に処理されるようになりました

Kotlin Toolchain 0.12: マルチプラットフォームライブラリ公開とWasmアプリ

2.4.20と同時期に、Kotlin Toolchain 0.12もリリースされました。こちらも合わせてチェックしておきましょう。

マルチプラットフォームライブラリの公開(プレビュー)

Toolchain 0.11ではJVMライブラリのみ対応だった公開機能が、0.12でマルチプラットフォームに対応しました。JVM、Android、iOS、WasmJSを1つの設定でMavenに公開できます。

product:
  type: lib
  platforms: [jvm, android, iosArm64, iosSimulatorArm64, wasmJs]
  settings:
    publishing:
      enabled: true
      group: org.example
      version: 1.0.0

Compose Hot Reload のMCPサーバー

Compose Hot ReloadにMCPサーバーが搭載されました。AIエージェントがアプリケーションと対話できるようになり、ホットリロードのトリガーやスクリーンショット取得、セマンティックツリーの検査が可能です。

{
  "mcpServers": {
    "Compose Hot Reload": {
      "command": "./kotlin",
      "args": ["compose-hot-reload-mcp-server"]
    }
  }
}

Kotlin 2.4.20 へのアップデート手順

プロジェクトのアップデートは基本的に build.gradle.kts のバージョン番号を変えるだけです。

plugins {
    kotlin("jvm") version "2.4.20"
    kotlin("multiplatform") version "2.4.20"
}

コマンドラインコンパイラはGitHub Releasesからダウンロードできます。なお、2.4.20ではkotlinrというネイティブイメージのランナーコマンドも実験的に提供されています。

まとめ

機能 ステータス 使えるシチュエーション
StackTraceRecoverable Stable with opt-in カスタム例外クラスでのコルーチン例外デバッグ
allDistinct / allEqual Experimental コレクションの簡単な検証・バリデーション
Swiftエクスポート強化 Alpha〜Stable KMPでiOSアプリをSwiftPM管理している場合
Wasmtime対応 Beta Wasm/WASIターゲットのランタイム選択
JSテストDSL Experimental Kotlin/JSのブラウザテスト
Build Tools API拡張 Experimental ビルドツール統合が必要なケース

Kotlin 2.4.20は、特に コルーチンを多用するプロジェクト と Kotlin MultiplatformでiOSをターゲットにしているプロジェクト にとって即座にアップデートする価値のあるリリースです。標準ライブラリの品質向上も継続的に行われており、日常のコーディングが少しずつ快適になっていくのを感じますね。

なお、Kotlin 2.4.20 からは互換性ガイドが更新されているので、メジャーバージョンアップの際は Kotlin 2.4 compatibility guide を一読しておくと安全です。

検証環境

OS Windows 11 (build 10.0.26200)
CPU AMD Ryzen 9 PRO 8945HS w/ Radeon 780M Graphics
メモリ 28GB
言語/ツール Kotlin 2.4.20(公式のコンイラ配布を一時ディレクトリに展開) / JDK 25.0.1
使用コマンド kotlinc main.kt -include-runtime -d main.jar && java -jar main.jar
測定日 2026-09-17

上記の環境で実際に実行して確認した結果です。環境が異なる場合は挙動が変わることがあります。

Kotlin 2.4.20 でコレクション同値チェックのAPIを実際にコンパイル・実行した結果
Kotlin 2.4.20 でコレクション同値チェックのAPIを実際にコンパイル・実行した結果

参考

本文の記述は以下の一次情報を確認して書いています。

あわせて読みたい

【広告】お名前.comならドメイン取得が格安。

【広告】このサイトはConoHa WINGで運営しています。安定した高速サーバーで快適にブログを書けています。いつもありがとう!!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次