Skip to content

Kotlin 1.5.30の新機能

リリース日: 2021年8月24日

Kotlin 1.5.30では、将来の変更点のプレビューを含む言語のアップデート、プラットフォームサポートやツールにおける様々な改善、そして新しい標準ライブラリの関数が提供されます。

主な改善点は以下の通りです。

  • 実験的なsealed when文、オプトイン要件の使用変更など、言語機能の改善
  • Appleシリコンのネイティブサポート
  • Kotlin/JS IRバックエンドがベータ版に到達
  • Gradleプラグインの体験向上

変更点の概要については、リリースブログの投稿とこちらの動画でもご確認いただけます。

言語機能

Kotlin 1.5.30では、将来の言語変更のプレビューが提供され、オプトイン要件メカニズムと型推論に改善がもたらされます。

sealedおよびBooleanのwhen文の網羅性

sealed (網羅的な) when文のサポートは実験的です。これはいつでも変更または廃止される可能性があります。 オプトインが必要です(詳細は下記参照)。評価目的でのみ使用してください。YouTrackでのフィードバックをお待ちしております。

網羅的な when文は、対象となるすべての可能な型または値、あるいは特定の型に対するブランチを含み、残りのケースをカバーするためにelseブランチを含みます。

when式の動作と一貫性を持たせるため、非網羅的なwhen文をまもなく禁止する予定です。円滑な移行を確実にするため、sealedクラスまたはBooleanを持つ非網羅的なwhen文について警告を報告するようにコンパイラを設定できます。このような警告はKotlin 1.6でデフォルトで表示され、後にエラーになります。

Enumはすでに警告が表示されます。

kotlin
sealed class Mode {
    object ON : Mode()
    object OFF : Mode()
}

fun main() {
    val x: Mode = Mode.ON
    when (x) { 
        Mode.ON -> println("ON")
    }
// WARNING: Non exhaustive 'when' statements on sealed classes/interfaces 
// will be prohibited in 1.7, add an 'OFF' or 'else' branch instead

    val y: Boolean = true
    when (y) {  
        true -> println("true")
    }
// WARNING: Non exhaustive 'when' statements on Booleans will be prohibited 
// in 1.7, add a 'false' or 'else' branch instead
}

Kotlin 1.5.30でこの機能を有効にするには、言語バージョン1.6を使用してください。プログレッシブモードを有効にすることで、警告をエラーに変更することもできます。

kotlin
kotlin {
    sourceSets.all {
        languageSettings.apply {
            languageVersion = "1.6"
            //progressiveMode = true // false by default
        }
    }
}
groovy
kotlin {
    sourceSets.all {
        languageSettings {
            languageVersion = '1.6'
            //progressiveMode = true // false by default
        }
    }
}

スーパークラスとしてのサスペンド関数

スーパークラスとしてのサスペンド関数のサポートは実験的です。これはいつでも変更または廃止される可能性があります。 オプトインが必要です(詳細は下記参照)。評価目的でのみ使用してください。YouTrackでのフィードバックをお待ちしております。

Kotlin 1.5.30では、いくつかの制限付きでsuspend関数型をスーパークラスとして使用できる機能のプレビューが提供されます。

kotlin
class MyClass: suspend () -> Unit {
    override suspend fun invoke() { TODO() }
}

この機能を有効にするには、-language-version 1.6コンパイラオプションを使用してください。

kotlin
kotlin {
    sourceSets.all {
        languageSettings.apply {
            languageVersion = "1.6"
        }
    }
}
groovy
kotlin {
    sourceSets.all {
        languageSettings {
            languageVersion = '1.6'
        }
    }
}

この機能には以下の制限があります。

  • 通常の関数型とsuspend関数型をスーパークラスとして混在させることはできません。これはJVMバックエンドにおけるsuspend関数型の実装詳細に起因します。これらはマーカーインターフェースを持つ通常の関数型として表現されるため、どのスーパークラスがサスペンド型で、どのスーパークラスが通常型であるかを区別する方法がありません。
  • 複数のsuspend関数型をスーパークラスとして使用することはできません。型チェックがある場合、複数の通常の関数型をスーパークラスとして使用することもできません。

実験的なAPIの暗黙的な使用に対するオプトインの要求

オプトイン要件メカニズムは実験的です。 これはいつでも変更される可能性があります。オプトイン方法を確認してください。 評価目的でのみ使用してください。YouTrackでのフィードバックをお待ちしております。

ライブラリの作者は、実験的なAPIがオプトインを必要とするものとしてマークし、その実験的な状態をユーザーに知らせることができます。APIが使用された際にコンパイラが警告またはエラーを発生させ、それを抑制するために明示的な同意が必要となります。

Kotlin 1.5.30では、コンパイラはシグネチャに実験的な型を持つすべての宣言を実験的として扱います。つまり、実験的なAPIの暗黙的な使用に対してもオプトインを要求します。例えば、関数の戻り値の型が実験的なAPI要素としてマークされている場合、その関数の使用には、宣言が明示的にオプトインを必要としないとマークされていても、オプトインが必要です。

kotlin
// Library code

@RequiresOptIn(message = "This API is experimental.")
@Retention(AnnotationRetention.BINARY)
@Target(AnnotationTarget.CLASS)
annotation class MyDateTime // Opt-in requirement annotation

@MyDateTime
class DateProvider // A class requiring opt-in

// Client code

// Warning: experimental API usage
fun createDateSource(): DateProvider { /* ... */ }

fun getDate(): Date {
    val dateSource = createDateSource() // Also warning: experimental API usage
    // ... 
}

オプトイン要件の詳細を確認してください。

異なるターゲットを持つオプトイン要件アノテーションの使用変更

オプトイン要件メカニズムは実験的です。 これはいつでも変更される可能性があります。オプトイン方法を確認してください。 評価目的でのみ使用してください。YouTrackでのフィードバックをお待ちしております。

Kotlin 1.5.30では、異なるターゲットに対してオプトイン要件アノテーションを使用および宣言するための新しいルールが導入されます。コンパイラは、コンパイル時に処理するのが非現実的なユースケースに対してエラーを報告するようになりました。Kotlin 1.5.30では以下の通りです。

  • 使用箇所でローカル変数と値パラメータをオプトイン要件アノテーションでマークすることは禁止されています。
  • オーバーライドのマークは、その基本宣言もマークされている場合にのみ許可されます。
  • バッキングフィールドとゲッターをマークすることは禁止されています。代わりに基本プロパティをマークできます。
  • オプトイン要件アノテーション宣言サイトでのTYPEおよびTYPE_PARAMETERアノテーションターゲットの設定は禁止されています。

オプトイン要件の詳細を確認してください。

再帰的なジェネリック型の型推論の改善

KotlinおよびJavaでは、型パラメータで自身を参照する再帰的なジェネリック型を定義できます。Kotlin 1.5.30では、Kotlinコンパイラは、対応する型パラメータが再帰的なジェネリック型である場合、その上限のみに基づいて型引数を推論できるようになりました。これにより、JavaでビルダーAPIを作成する際によく使用される再帰的なジェネリック型を用いた様々なパターンを作成することが可能になります。

kotlin
// Kotlin 1.5.20
val containerA = PostgreSQLContainer<Nothing>(DockerImageName.parse("postgres:13-alpine")).apply {
    withDatabaseName("db")
    withUsername("user")
    withPassword("password")
    withInitScript("sql/schema.sql")
}

// Kotlin 1.5.30
val containerB = PostgreSQLContainer(DockerImageName.parse("postgres:13-alpine"))
    .withDatabaseName("db")
    .withUsername("user")
    .withPassword("password")
    .withInitScript("sql/schema.sql")

改善を有効にするには、-Xself-upper-bound-inferenceまたは-language-version 1.6コンパイラオプションを渡します。新たにサポートされたユースケースの他の例については、こちらのYouTrackチケットを参照してください。

ビルダー推論の制限の解消

ビルダー推論は、ラムダ引数内の他の呼び出しからの型情報に基づいて、呼び出しの型引数を推論できる特殊な型推論です。これは、buildList()sequence()のような汎用ビルダー関数を呼び出す際に役立ちます。例: buildList { add("string") }

このようなラムダ引数内では、これまでビルダー推論が推論しようとする型情報の使用に制限がありました。つまり、それを指定することはできても、取得することはできませんでした。例えば、明示的に型引数を指定しない限り、buildList()のラムダ引数内でget()を呼び出すことはできませんでした。

Kotlin 1.5.30では、-Xunrestricted-builder-inferenceコンパイラオプションによってこれらの制限が解消されます。このオプションを追加することで、汎用ビルダー関数のラムダ引数内でこれまで禁止されていた呼び出しが可能になります。

kotlin
@kotlin.ExperimentalStdlibApi
val list = buildList {
    add("a")
    add("b")
    set(1, null)
    val x = get(1)
    if (x != null) {
        removeAt(1)
    }
}

@kotlin.ExperimentalStdlibApi
val map = buildMap {
    put("a", 1)
    put("b", 1.1)
    put("c", 2f)
}

また、-language-version 1.6コンパイラオプションでもこの機能を有効にできます。

Kotlin/JVM

Kotlin 1.5.30では、Kotlin/JVMに以下の機能が追加されます。

JVMプラットフォームにおけるKotlin Gradleプラグインの更新については、Gradleセクションを参照してください。

アノテーションクラスのインスタンス化

アノテーションクラスのインスタンス化は実験的です。これはいつでも変更または廃止される可能性があります。 オプトインが必要です(詳細は下記参照)。評価目的でのみ使用してください。YouTrackでのフィードバックをお待ちしております。

Kotlin 1.5.30では、アノテーションクラスのコンストラクタを任意のコードで呼び出して、結果のインスタンスを取得できるようになりました。この機能は、アノテーションインターフェースの実装を許可するJavaの慣習と同じユースケースをカバーします。

kotlin
annotation class InfoMarker(val info: String)

fun processInfo(marker: InfoMarker) = ...

fun main(args: Array<String>) {
    if (args.size != 0)
        processInfo(getAnnotationReflective(args))
    else
        processInfo(InfoMarker("default"))
}

この機能を有効にするには、-language-version 1.6コンパイラオプションを使用してください。非valパラメータやセカンダリコンストラクタとは異なるメンバーを定義する制限など、現在のアノテーションクラスのすべての制限はそのまま残ることに注意してください。

アノテーションクラスのインスタンス化の詳細については、こちらのKEEPを参照してください。

null許容アノテーションサポート設定の改善

Kotlinコンパイラは、様々な種類のnull許容アノテーションを読み取り、Javaからのnull許容情報を取得できます。この情報により、Javaコードを呼び出す際にKotlinでnull許容の不一致を報告できるようになります。

Kotlin 1.5.30では、特定の種類のnull許容アノテーションからの情報に基づいて、コンパイラがnull許容の不一致を報告するかどうかを指定できます。コンパイラオプション-Xnullability-annotations=@<package-name>:<report-level>を使用するだけです。引数には、完全修飾されたnull許容アノテーションパッケージと、以下のレポートレベルのいずれかを指定します。

  • ignoreでnull許容の不一致を無視
  • warnで警告を報告
  • strictでエラーを報告

サポートされているnull許容アノテーションの完全なリストと、それらの完全修飾パッケージ名を確認してください。

新しくサポートされたRxJava 3のnull許容アノテーションのエラー報告を有効にする例を以下に示します: [email protected]:strict。なお、このようなnull許容の不一致はすべてデフォルトで警告となります。

Kotlin/Native

Kotlin/Nativeは様々な変更と改善を受けました。

Appleシリコンのサポート

Kotlin 1.5.30は、Appleシリコンのネイティブサポートを導入します。

これまで、Kotlin/Nativeコンパイラとツールは、Appleシリコンホストで動作するためにRosettaトランスレーション環境を必要としていました。Kotlin 1.5.30では、トランスレーション環境はもはや不要となり、コンパイラとツールは追加のアクションを必要とせずにAppleシリコンハードウェア上で実行できます。

また、KotlinコードをAppleシリコン上でネイティブに実行できるようにする新しいターゲットも導入しました。

  • macosArm64
  • iosSimulatorArm64
  • watchosSimulatorArm64
  • tvosSimulatorArm64

これらはIntelベースとAppleシリコンの両方のホストで利用可能です。既存のすべてのターゲットもAppleシリコンホストで利用できます。

Kotlin 1.5.30では、kotlin-multiplatform GradleプラグインにおいてAppleシリコンターゲットの基本的なサポートのみを提供していることに注意してください。特に、新しいシミュレータターゲットは、iostvoswatchosのターゲットショートカットには含まれていません。 私たちは引き続き、新しいターゲットでのユーザーエクスペリエンスを向上させるために取り組んでいきます。

CocoaPods GradleプラグインのKotlin DSLの改善

Kotlin/Nativeフレームワークの新しいパラメータ

Kotlin 1.5.30では、Kotlin/Nativeフレームワーク向けのCocoaPods GradleプラグインDSLが改善されました。フレームワーク名に加えて、Pod設定で他のパラメータを指定できるようになりました。

  • フレームワークの動的または静的バージョンを指定
  • 依存関係を明示的にエクスポートを有効化
  • Bitcode埋め込みを有効化

新しいDSLを使用するには、プロジェクトをKotlin 1.5.30に更新し、build.gradle(.kts)ファイルのcocoapodsセクションでパラメータを指定します。

kotlin
cocoapods {
    frameworkName = "MyFramework" // このプロパティは非推奨です
    // 将来のバージョンで削除されます
    // フレームワーク設定の新しいDSL:
    framework {
        // すべてのFrameworkプロパティがサポートされています
        // フレームワーク名の設定。このプロパティを使用してください。
        // 非推奨の 'frameworkName' の代わりに
        baseName = "MyFramework"
        // 動的フレームワークのサポート
        isStatic = false
        // 依存関係のエクスポート
        export(project(":anotherKMMModule"))
        transitiveExport = false // これはデフォルトです。
        // Bitcodeの埋め込み
        embedBitcode(BITCODE)
    }
}

Xcode構成のカスタム名のサポート

Kotlin CocoaPods Gradleプラグインは、Xcodeビルド構成でのカスタム名をサポートします。これは、XcodeでStagingのような特別なビルド構成名を使用している場合にも役立ちます。

カスタム名を指定するには、build.gradle(.kts)ファイルのcocoapodsセクションでxcodeConfigurationToNativeBuildTypeパラメータを使用します。

kotlin
cocoapods {
    // カスタムXcode構成をNativeBuildTypeにマッピング
    xcodeConfigurationToNativeBuildType["CUSTOM_DEBUG"] = NativeBuildType.DEBUG
    xcodeConfigurationToNativeBuildType["CUSTOM_RELEASE"] = NativeBuildType.RELEASE
}

このパラメータはPodspecファイルには表示されません。XcodeがGradleビルドプロセスを実行すると、Kotlin CocoaPods Gradleプラグインが必要なネイティブビルドタイプを選択します。

DebugReleaseの構成はデフォルトでサポートされているため、宣言する必要はありません。

Swift 5.5 async/awaitとの実験的な相互運用性

Swift async/awaitとの並行処理の相互運用性は実験的です。これはいつでも変更または廃止される可能性があります。 評価目的でのみ使用してください。YouTrackでのフィードバックをお待ちしております。

Kotlin 1.4.0でKotlinのサスペンド関数をObjective-CおよびSwiftから呼び出すサポートを追加しましたが、Swift 5.5の新機能であるasyncおよびawait修飾子による並行処理に対応するために、それを改善しています。

Kotlin/Nativeコンパイラは、null許容の戻り値型を持つサスペンド関数のために、生成されたObjective-Cヘッダーに_Nullable_result属性を出力するようになりました。これにより、Swiftから適切なnull許容性を持つasync関数としてこれらを呼び出すことが可能になります。

この機能は実験的であり、将来的にKotlinとSwiftの両方の変更によって影響を受ける可能性があることに注意してください。今のところ、私たちはいくつかの制限があるこの機能のプレビューを提供しており、皆様のご意見をぜひお聞かせください。現在の状態の詳細とフィードバックは、こちらのYouTrackイシューに残してください。

オブジェクトとコンパニオンオブジェクトに対するSwift/Objective-Cマッピングの改善

オブジェクトとコンパニオンオブジェクトの取得が、ネイティブiOS開発者にとってより直感的な方法でできるようになりました。例えば、Kotlinで以下のオブジェクトがある場合:

kotlin
object MyObject {
    val x = "Some value"
}

class MyClass {
    companion object {
        val x = "Some value"
    }
}

Swiftでそれらにアクセスするには、sharedcompanionプロパティを使用できます。

swift
MyObject.shared
MyObject.shared.x
MyClass.companion
MyClass.Companion.shared

Swift/Objective-C相互運用性の詳細を確認してください。

MinGWターゲット向けのインポートライブラリなしDLLへのリンクの非推奨化

LLDはLLVMプロジェクトのリンカであり、デフォルトのld.bfdよりも優れたパフォーマンスという利点から、MinGWターゲットのKotlin/NativeでLLDの使用を開始する予定です。

しかしながら、LLDの最新安定版はMinGW (Windows) ターゲット向けのDLLへの直接リンクをサポートしていません。そのようなリンクにはインポートライブラリの使用が必要です。Kotlin/Native 1.5.30ではそれらは不要ですが、将来的にMinGWのデフォルトリンカとなるLLDとは互換性がないことをお知らせするために警告を追加しています。

LLDリンカへの移行に関するご意見や懸念事項は、こちらのYouTrackイシューで共有してください。

Kotlin Multiplatform

1.5.30では、Kotlin Multiplatformに以下の注目すべきアップデートがもたらされます。

共有ネイティブコードでカスタムcinteropライブラリを使用する機能

Kotlin Multiplatformは、共有ソースセットでプラットフォーム依存の相互運用ライブラリを使用するオプションを提供します。1.5.30より前は、Kotlin/Nativeディストリビューションに同梱されているプラットフォームライブラリでのみ動作していました。1.5.30からは、カスタムcinteropライブラリでも使用できるようになります。この機能を有効にするには、gradle.propertieskotlin.mpp.enableCInteropCommonization=trueプロパティを追加します。

none
kotlin.mpp.enableGranularSourceSetsMetadata=true
kotlin.native.enableDependencyPropagation=false
kotlin.mpp.enableCInteropCommonization=true

XCFrameworksのサポート

すべてのKotlin Multiplatformプロジェクトは、XCFrameworksを出力フォーマットとして使用できるようになりました。Appleはユニバーサル(fat)フレームワークの代替としてXCFrameworksを導入しました。XCFrameworksを使用すると、次のことができます。

  • すべてのターゲットプラットフォームとアーキテクチャのロジックを単一のバンドルにまとめることができます。
  • アプリケーションをApp Storeに公開する前に、不要なアーキテクチャをすべて削除する必要がありません。

XCFrameworksは、Apple M1デバイスとシミュレータでKotlinフレームワークを使用したい場合に役立ちます。

XCFrameworksを使用するには、build.gradle(.kts)スクリプトを更新してください。

kotlin
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFramework

plugins {
    kotlin("multiplatform")
}

kotlin {
    val xcf = XCFramework()
  
    ios {
        binaries.framework {
            baseName = "shared"
            xcf.add(this)
        }
    }
    watchos {
        binaries.framework {
            baseName = "shared"
            xcf.add(this)
        }
    }
    tvos {
        binaries.framework {
            baseName = "shared"
            xcf.add(this)
        }
    }
}
groovy
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFrameworkConfig

plugins {
    id 'org.jetbrains.kotlin.multiplatform'
}

kotlin {
    def xcf = new XCFrameworkConfig(project)

    ios {
        binaries.framework {
            baseName = "shared"
            xcf.add(it)
        }
    }
    watchos {
        binaries.framework {
            baseName = "shared"
            xcf.add(it)
        }
    }
    tvos {
        binaries.framework {
            baseName = "shared"
            xcf.add(it)
        }
    }
}

XCFrameworksを宣言すると、以下の新しいGradleタスクが登録されます。

  • assembleXCFramework
  • assembleDebugXCFramework(さらにdSYMsを含むデバッグアーティファクト)
  • assembleReleaseXCFramework

XCFrameworksの詳細については、このWWDCビデオを参照してください。

Androidアーティファクトの新しいデフォルト公開設定

maven-publish Gradleプラグインを使用すると、ビルドスクリプトでAndroidバリアント名を指定することで、Androidターゲット向けマルチプラットフォームライブラリを公開できます。Kotlin Gradleプラグインは自動的に公開物を生成します。

1.5.30より前は、生成された公開メタデータには、公開されたすべてのAndroidバリアントのビルドタイプ属性が含まれており、ライブラリのコンシューマが使用するのと同じビルドタイプとのみ互換性がありました。Kotlin 1.5.30では、新しいデフォルトの公開設定が導入されます。

  • プロジェクトが公開するすべてのAndroidバリアントが同じビルドタイプ属性を持つ場合、公開されたバリアントにはビルドタイプ属性がなくなり、任意のビルドタイプと互換性を持つようになります。
  • 公開されたバリアントが異なるビルドタイプ属性を持つ場合、release値を持つもののみがビルドタイプ属性なしで公開されます。これにより、リリースバリアントはコンシューマ側で任意のビルドタイプと互換性を持つようになりますが、非リリースバリアントは一致するコンシューマビルドタイプとのみ互換性を持つことになります。

オプトアウトしてすべてのバリアントのビルドタイプ属性を保持するには、このGradleプロパティを設定します: kotlin.android.buildTypeAttribute.keep=true

Kotlin/JS

Kotlin 1.5.30では、Kotlin/JSに2つの主要な改善がもたらされます。

JS IRコンパイラバックエンドがベータ版に到達

Kotlin/JS向けのIRベースのコンパイラバックエンドは、1.4.0でアルファ版として導入されましたが、ベータ版に到達しました。

以前、新しいバックエンドにプロジェクトを移行するのに役立つJS IRバックエンドの移行ガイドを公開しました。今回は、IntelliJ IDEAに直接必要な変更を表示するKotlin/JS Inspection Pack IDEプラグインをご紹介します。

Kotlin/JS IRバックエンドを使用するアプリケーションのデバッグ体験の向上

Kotlin 1.5.30では、Kotlin/JS IRバックエンド用のJavaScriptソースマップ生成が導入されます。これにより、IRバックエンドが有効な場合のKotlin/JSのデバッグ体験が向上し、ブレークポイント、ステップ実行、適切なソース参照付きの読みやすいスタックトレースを含む完全なデバッグサポートが提供されます。

ブラウザまたはIntelliJ IDEA UltimateでKotlin/JSをデバッグする方法については、こちらを参照してください。

Gradle

Kotlin Gradleプラグインのユーザーエクスペリエンスを向上させるという私たちのミッションの一環として、以下の機能を実装しました。

Javaツールチェインのサポート

Gradle 6.7では、「Javaツールチェインサポート」機能が導入されました。 この機能を使用すると、次のことができます。

  • Gradleのものとは異なるJDKやJREを使用して、コンパイル、テスト、実行可能ファイルを実行できます。
  • 未リリースの言語バージョンでコードをコンパイルおよびテストできます。

ツールチェインサポートにより、GradleはローカルJDKを自動検出し、ビルドに必要な不足しているJDKをインストールできます。これでGradle自体は任意のJDK上で動作しながら、ビルドキャッシュ機能を再利用できます。

Kotlin Gradleプラグインは、Kotlin/JVMコンパイルタスクでJavaツールチェインをサポートします。 Javaツールチェインは以下の通りです。

ツールチェインを設定するには、以下のコードを使用します。プレースホルダー<MAJOR_JDK_VERSION>を使用したいJDKバージョンに置き換えてください。

kotlin
kotlin {
    jvmToolchain {
        (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)) // "8"
    }
}
groovy
kotlin {
    jvmToolchain {
        languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)) // "8"
    }
}

kotlin拡張機能を通じてツールチェインを設定すると、Javaコンパイルタスクのツールチェインも更新されることに注意してください。

java拡張機能を通じてツールチェインを設定することもでき、Kotlinコンパイルタスクはそれを使用します。

kotlin
java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)) // "8"
    }
}

KotlinCompileタスクのJDKバージョン設定については、Task DSLでJDKバージョンを設定するに関するドキュメントを参照してください。

Gradle 6.1から6.6のバージョンでは、JDKホームを設定するためにUsesKotlinJavaToolchainインターフェースを使用してください。

UsesKotlinJavaToolchainインターフェースを使用してJDKホームを指定する機能

kotlinOptionsを介してJDK設定をサポートするすべてのKotlinタスクが、UsesKotlinJavaToolchainインターフェースを実装するようになりました。JDKホームを設定するには、JDKへのパスを記述し、<JDK_VERSION>プレースホルダーを置き換えてください。

kotlin
project.tasks
    .withType<UsesKotlinJavaToolchain>()
    .configureEach {
        it.kotlinJavaToolchain.jdk.use(
            "/path/to/local/jdk",
            JavaVersion.<LOCAL_JDK_VERSION>
        )
    }
groovy
project.tasks
    .withType(UsesKotlinJavaToolchain.class)
    .configureEach {
        it.kotlinJavaToolchain.jdk.use(
            '/path/to/local/jdk',
            JavaVersion.<LOCAL_JDK_VERSION>
        )
    }

Gradle 6.1から6.6のバージョンでは、UsesKotlinJavaToolchainインターフェースを使用してください。Gradle 6.7以降では、代わりにJavaツールチェインを使用してください。

この機能を使用する場合、kaptタスクワーカープロセス分離モードのみを使用し、kapt.workers.isolationプロパティは無視されることに注意してください。

KotlinデーモンのJVM引数を明示的に指定するより簡単な方法

Kotlin 1.5.30では、KotlinデーモンのJVM引数に新しいロジックが導入されました。以下のリストの各オプションは、それ以前のオプションを上書きします。

  • 何も指定されていない場合、Kotlinデーモンは(以前と同様に)Gradleデーモンから引数を継承します。例えば、gradle.propertiesファイルでは次のようになります。

    none
    org.gradle.jvmargs=-Xmx1500m -Xms=500m
  • GradleデーモンのJVM引数にkotlin.daemon.jvm.optionsシステムプロパティがある場合、以前と同様に使用します。

    none
    org.gradle.jvmargs=-Dkotlin.daemon.jvm.options=-Xmx1500m -Xms=500m
  • gradle.propertiesファイルにkotlin.daemon.jvmargsプロパティを追加できます。

    none
    kotlin.daemon.jvmargs=-Xmx1500m -Xms=500m
  • kotlin拡張機能で引数を指定できます。

    kotlin
    kotlin {
        kotlinDaemonJvmArgs = listOf("-Xmx486m", "-Xms256m", "-XX:+UseParallelGC")
    }
    groovy
    kotlin {
        kotlinDaemonJvmArgs = ["-Xmx486m", "-Xms256m", "-XX:+UseParallelGC"]
    }
  • 特定のタスクの引数を指定できます。

    kotlin
    tasks
        .matching { it.name == "compileKotlin" && it is CompileUsingKotlinDaemon }
        .configureEach {
            (this as CompileUsingKotlinDaemon).kotlinDaemonJvmArguments.set(listOf("-Xmx486m", "-Xms256m", "-XX:+UseParallelGC"))
        }
    groovy
    tasks
        .matching {
            it.name == "compileKotlin" && it instanceof CompileUsingKotlinDaemon
        }
        .configureEach {
            kotlinDaemonJvmArguments.set(["-Xmx1g", "-Xms512m"])
        }

    この場合、タスク実行時に新しいKotlinデーモンインスタンスが起動する可能性があります。KotlinデーモンのJVM引数との相互作用について詳しく確認してください。

Kotlinデーモンの詳細については、KotlinデーモンとGradleでの使用方法を参照してください。

標準ライブラリ

Kotlin 1.5.30では、標準ライブラリのDurationRegex APIに改善がもたらされます。

Duration.toString()の出力変更

Duration APIは実験的です。これはいつでも変更または廃止される可能性があります。 評価目的でのみ使用してください。YouTrackでのフィードバックをお待ちしております。

Kotlin 1.5.30より前では、Duration.toString()関数は、その引数の文字列表現を、最もコンパクトで読みやすい数値となる単位で返していました。 今後は、各数値コンポーネントがそれぞれの単位で表現された文字列値を返します。 各コンポーネントは、数値の後に単位の略称(dhms)が続きます。例:

関数呼び出しの例以前の出力現在の出力
Duration.days(45).toString()45.0d45d
Duration.days(1.5).toString()36.0h1d 12h
Duration.minutes(1230).toString()20.5h20h 30m
Duration.minutes(2415).toString()40.3h1d 16h 15m
Duration.minutes(920).toString()920m15h 20m
Duration.seconds(1.546).toString()1.55s1.546s
Duration.milliseconds(25.12).toString()25.1ms25.12ms

負の期間の表現方法も変更されました。負の期間はマイナス記号(-)が接頭辞として付加され、複数のコンポーネントから構成される場合は括弧で囲まれます: -12mおよび-(1h 30m)

1秒未満の短い期間は、秒未満の単位(例: ms (ミリ秒)、us (マイクロ秒)、ns (ナノ秒))を持つ単一の数値として表現されることに注意してください: 140.884ms500us24ns。それらを表現するために科学的記数法はもはや使用されません。

期間を単一の単位で表現したい場合は、オーバーロードされたDuration.toString(unit, decimals)関数を使用してください。

シリアライゼーションやデータ交換を含む特定のケースでは、Duration.toIsoString()を使用することをお勧めします。Duration.toIsoString()は、Duration.toString()の代わりに、より厳密なISO-8601形式を使用します。

StringからDurationをパース

Duration APIは実験的です。これはいつでも変更または廃止される可能性があります。 評価目的でのみ使用してください。こちらのイシューでのフィードバックをお待ちしております。

Kotlin 1.5.30では、Duration APIに新しい関数が追加されました。

parse()parseOrNull()の使用例をいくつか示します。

kotlin
import kotlin.time.Duration
import kotlin.time.ExperimentalTime

@ExperimentalTime
fun main() {
    val isoFormatString = "PT1H30M"
    val defaultFormatString = "1h 30m"
    val singleUnitFormatString = "1.5h"
    val invalidFormatString = "1 hour 30 minutes"
    println(Duration.parse(isoFormatString)) // "1h 30m"
    println(Duration.parse(defaultFormatString)) // "1h 30m"
    println(Duration.parse(singleUnitFormatString)) // "1h 30m"
    //println(Duration.parse(invalidFormatString)) // throws exception
    println(Duration.parseOrNull(invalidFormatString)) // "null"
}

そして、parseIsoString()parseIsoStringOrNull()の使用例をいくつか示します。

kotlin
import kotlin.time.Duration
import kotlin.time.ExperimentalTime

@ExperimentalTime
fun main() {
    val isoFormatString = "PT1H30M"
    val defaultFormatString = "1h 30m"
    println(Duration.parseIsoString(isoFormatString)) // "1h 30m"
    //println(Duration.parseIsoString(defaultFormatString)) // throws exception
    println(Duration.parseIsoStringOrNull(defaultFormatString)) // "null"
}

特定の箇所でのRegexによるマッチング

Regex.matchAt()Regex.matchesAt()関数は実験的です。これらはいつでも変更または廃止される可能性があります。 評価目的でのみ使用してください。YouTrackでのフィードバックをお待ちしております。

新しいRegex.matchAt()Regex.matchesAt()関数は、StringまたはCharSequenceの特定の箇所で正規表現が完全に一致するかどうかをチェックする方法を提供します。

matchesAt()はブール値を返します。

kotlin
fun main(){
    val releaseText = "Kotlin 1.5.30 is released!"
    // 正規表現: 1桁の数字、ドット、1桁の数字、ドット、1桁以上の数字
    val versionRegex = "\\d[.]\\d[.]\\d+".toRegex()
    println(versionRegex.matchesAt(releaseText, 0)) // "false"
    println(versionRegex.matchesAt(releaseText, 7)) // "true"
}

matchAt()は一致が見つかればその一致を返し、見つからなければnullを返します。

kotlin
fun main(){
    val releaseText = "Kotlin 1.5.30 is released!"
    val versionRegex = "\\d[.]\\d[.]\\d+".toRegex()
    println(versionRegex.matchAt(releaseText, 0)) // "null"
    println(versionRegex.matchAt(releaseText, 7)?.value) // "1.5.30"
}

Regexをシーケンスに分割

Regex.splitToSequence()CharSequence.splitToSequence(Regex)関数は実験的です。これらはいつでも変更または廃止される可能性があります。 評価目的でのみ使用してください。YouTrackでのフィードバックをお待ちしております。

新しいRegex.splitToSequence()関数は、split()の遅延評価版です。指定された正規表現に一致する箇所で文字列を分割しますが、その結果はSequenceとして返されるため、この結果に対するすべての操作は遅延実行されます。

kotlin
fun main(){
    val colorsText = "green, red , brown&blue, orange, pink&green"
    val regex = "[,\\s]+".toRegex()
    val mixedColor = regex.splitToSequence(colorsText)
        .onEach { println(it) }
        .firstOrNull { it.contains('&') }
    println(mixedColor) // "brown&blue"
}

同様の関数がCharSequenceにも追加されました。

kotlin
    val mixedColor = colorsText.splitToSequence(regex)

Serialization 1.3.0-RC

kotlinx.serialization 1.3.0-RCが、新しいJSONシリアライゼーション機能を備えて登場しました。

  • Java IOストリームのシリアライゼーション
  • デフォルト値に対するプロパティレベルの制御
  • null値をシリアライゼーションから除外するオプション
  • ポリモーフィックシリアライゼーションにおけるカスタムクラス識別子

詳細については、変更履歴を参照してください。