Kotlin 1.5.30の新機能
Kotlin 1.5.30では、将来の変更のプレビューを含む言語アップデート、プラットフォームサポートとツールに関するさまざまな改善、および新しい標準ライブラリ関数が提供されます。
主な改善点は以下の通りです。
- 実験的なsealed
when
ステートメント、オプトイン要件の使用変更などを含む言語機能 - Appleシリコンのネイティブサポート
- Kotlin/JS IRバックエンドがベータ版に到達
- Gradleプラグインの体験向上
変更点の短い概要は、リリースブログ記事とこちらの動画でも確認できます。
言語機能
Kotlin 1.5.30では、将来の言語変更のプレビューが提供され、オプトイン要件メカニズムと型推論に改善がもたらされます。
- sealed および Boolean の被験者に対する網羅的な
when
ステートメント - スーパークラスとしての suspending 関数
- 実験的APIの暗黙的な使用に対するオプトイン要件
- 異なるターゲットを持つオプトイン要件アノテーションの使用変更
- 再帰的なジェネリック型の型推論の改善
- ビルダー推論の制限の排除
sealed および Boolean の被験者に対する網羅的な when
ステートメント
DANGER
sealed (網羅的) when
ステートメントのサポートは実験的です。これはいつでも削除または変更される可能性があります。
オプトインが必須であり(詳細は下記を参照)、評価目的でのみ使用してください。YouTrackでフィードバックをいただけると幸いです。
網羅的な when
ステートメントには、その被験者のすべての可能な型または値に対するブランチ、または特定の型に対するブランチが含まれ、残りのケースをカバーするための else
ブランチが含まれます。
私たちはまもなく、非網羅的な when
ステートメントを禁止し、when
式の動作と一貫性を持たせることを計画しています。スムーズな移行を確実にするため、sealed クラスまたは Boolean を持つ非網羅的な when
ステートメントについてコンパイラが警告を報告するように構成できます。このような警告はKotlin 1.6でデフォルトで表示され、将来的にはエラーになります。
NOTE
Enumはすでに警告が表示されます。
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 {
sourceSets.all {
languageSettings.apply {
languageVersion = "1.6"
//progressiveMode = true // false by default
}
}
}
kotlin {
sourceSets.all {
languageSettings {
languageVersion = '1.6'
//progressiveMode = true // false by default
}
}
}
スーパークラスとしての suspending 関数
DANGER
suspending 関数をスーパークラスとして使用するサポートは実験的です。これはいつでも削除または変更される可能性があります。
オプトインが必須であり(詳細は下記を参照)、評価目的でのみ使用してください。YouTrackでフィードバックをいただけると幸いです。
Kotlin 1.5.30では、いくつかの制限付きで suspend
関数型をスーパークラスとして使用する機能のプレビューが提供されます。
class MyClass: suspend () -> Unit {
override suspend fun invoke() { TODO() }
}
この機能を有効にするには、-language-version 1.6
コンパイラオプションを使用します。
kotlin {
sourceSets.all {
languageSettings.apply {
languageVersion = "1.6"
}
}
}
kotlin {
sourceSets.all {
languageSettings {
languageVersion = '1.6'
}
}
}
この機能には以下の制限があります。
- 通常の関数型と
suspend
関数型をスーパークラスとして混在させることはできません。これは、JVMバックエンドにおけるsuspend
関数型の実装の詳細によるものです。これらはマーカーインターフェースを持つ通常の関数型として表現されます。マーカーインターフェースのため、どのスーパーインターフェースがsuspend
で、どれが通常のものかを区別する方法がありません。 - 複数の
suspend
関数型をスーパークラスとして使用することはできません。型チェックがある場合、複数の通常の関数型をスーパークラスとして使用することもできません。
実験的APIの暗黙的な使用に対するオプトイン要件
DANGER
オプトイン要件メカニズムは実験的です。
これはいつでも変更される可能性があります。オプトインの方法を参照してください。
評価目的でのみ使用してください。YouTrackでフィードバックをいただけると幸いです。
ライブラリの作者は、実験的なAPIをオプトイン要件としてマークすることで、その実験的状態をユーザーに知らせることができます。APIが使用されると、コンパイラは警告またはエラーを発生させ、それを抑制するために明示的な同意を要求します。
Kotlin 1.5.30では、コンパイラはシグネチャに実験的な型を持つすべての宣言を実験的として扱います。つまり、実験的なAPIの暗黙的な使用に対してもオプトインを要求します。例えば、関数の戻り値の型が実験的なAPI要素としてマークされている場合、その宣言が明示的にオプトインを要求するようにマークされていなくても、その関数の使用にはオプトインが必要になります。
// 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
// ...
}
オプトイン要件についてさらに詳しく学ぶ。
異なるターゲットを持つオプトイン要件アノテーションの使用変更
DANGER
オプトイン要件メカニズムは実験的です。
これはいつでも変更される可能性があります。オプトインの方法を参照してください。
評価目的でのみ使用してください。YouTrackでフィードバックをいただけると幸いです。
Kotlin 1.5.30では、異なるターゲットを持つオプトイン要件アノテーションの使用と宣言に関する新しいルールが導入されます。コンパイラは、コンパイル時に処理するのが非実用的なユースケースに対してエラーを報告するようになりました。Kotlin 1.5.30では以下の通りです。
- ローカル変数および値パラメータをオプトイン要件アノテーションでマークすることは、使用箇所では禁止されています。
- オーバーライドのマークは、その基本宣言もマークされている場合にのみ許可されます。
- バッキングフィールドとゲッターのマークは禁止されています。代わりに基本プロパティをマークできます。
TYPE
およびTYPE_PARAMETER
アノテーションターゲットをオプトイン要件アノテーション宣言サイトで設定することは禁止されています。
オプトイン要件についてさらに詳しく学ぶ。
再帰的なジェネリック型の型推論の改善
KotlinとJavaでは、型パラメータで自分自身を参照する再帰的なジェネリック型を定義できます。Kotlin 1.5.30では、Kotlinコンパイラは、対応する型パラメータが再帰的なジェネリックである場合、その上限のみに基づいて型引数を推論できるようになりました。これにより、JavaでビルダーAPIを作成するためによく使用される、再帰的なジェネリック型を使ったさまざまなパターンを作成することが可能になります。
// 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.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セクションを参照してください。
アノテーションクラスのインスタンス化
DANGER
アノテーションクラスのインスタンス化は実験的です。これはいつでも削除または変更される可能性があります。
オプトインが必須であり(詳細は下記を参照)、評価目的でのみ使用してください。YouTrackでフィードバックをいただけると幸いです。
Kotlin 1.5.30では、アノテーションクラスのコンストラクタを任意のコードで呼び出して、結果のインスタンスを取得できるようになりました。この機能は、アノテーションインターフェースの実装を許可するJavaの規約と同じユースケースをカバーします。
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で詳しく学ぶ。
Nullabilityアノテーションサポート設定の改善
Kotlinコンパイラは、さまざまな種類のNullabilityアノテーションを読み取り、JavaからのNullability情報を取得できます。この情報により、Javaコードを呼び出すときにKotlinでNullabilityの不一致を報告できます。
Kotlin 1.5.30では、特定の種類のNullabilityアノテーションからの情報に基づいて、コンパイラがNullabilityの不一致を報告するかどうかを指定できます。コンパイラオプション -Xnullability-annotations=@<package-name>:<report-level>
を使用するだけです。引数には、完全修飾されたNullabilityアノテーションパッケージ名と、次のいずれかのレポートレベルを指定します。
ignore
でNullabilityの不一致を無視warn
で警告を報告strict
でエラーを報告
サポートされているNullabilityアノテーションの完全なリストと、それらの完全修飾パッケージ名を参照してください。
新しくサポートされたRxJava 3のNullabilityアノテーションのエラー報告を有効にする例を以下に示します: [email protected]:strict
。このようなNullabilityの不一致は、デフォルトではすべて警告になることに注意してください。
Kotlin/Native
Kotlin/Nativeには、さまざまな変更と改善が加えられました。
- Appleシリコンのサポート
- CocoaPods GradleプラグインのKotlin DSLの改善
- Swift 5.5 async/awaitとの実験的な相互運用
- オブジェクトとコンパニオンオブジェクトのSwift/Objective-Cマッピングの改善
- MinGWターゲット向けのインポートライブラリなしのDLLへのリンクの非推奨化
Appleシリコンのサポート
Kotlin 1.5.30では、Appleシリコンのネイティブサポートが導入されました。
以前は、Kotlin/NativeコンパイラとツールはAppleシリコンホストでの作業にRosettaトランスレーション環境を必要としていました。Kotlin 1.5.30では、トランスレーション環境はもはや不要です。コンパイラとツールは追加のアクションなしでAppleシリコンハードウェア上で実行できます。
また、KotlinコードをAppleシリコン上でネイティブに実行するための新しいターゲットも導入されました。
macosArm64
iosSimulatorArm64
watchosSimulatorArm64
tvosSimulatorArm64
これらはIntelベースとAppleシリコンホストの両方で利用可能です。既存のすべてのターゲットもAppleシリコンホストで利用可能です。
1.5.30では、kotlin-multiplatform
GradleプラグインにおいてAppleシリコンターゲットの基本的なサポートのみを提供していることに注意してください。特に、新しいシミュレーターターゲットはios
、tvos
、watchos
のターゲットショートカットには含まれていません。 新しいターゲットでのユーザーエクスペリエンスを向上させるために、引き続き作業を進めます。
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
セクションでパラメータを指定します。
cocoapods {
frameworkName = "MyFramework" // This property is deprecated
// and will be removed in future versions
// New DSL for framework configuration:
framework {
// All Framework properties are supported
// Framework name configuration. Use this property instead of
// deprecated 'frameworkName'
baseName = "MyFramework"
// Dynamic framework support
isStatic = false
// Dependency export
export(project(":anotherKMMModule"))
transitiveExport = false // This is default.
// Bitcode embedding
embedBitcode(BITCODE)
}
}
Xcode設定のカスタム名のサポート
Kotlin CocoaPods Gradleプラグインは、Xcodeビルド設定でのカスタム名をサポートしています。これは、Xcodeでビルド設定に特殊な名前(例: Staging
)を使用している場合にも役立ちます。
カスタム名を指定するには、build.gradle(.kts)
ファイルのcocoapods
セクションでxcodeConfigurationToNativeBuildType
パラメータを使用します。
cocoapods {
// Maps custom Xcode configuration to NativeBuildType
xcodeConfigurationToNativeBuildType["CUSTOM_DEBUG"] = NativeBuildType.DEBUG
xcodeConfigurationToNativeBuildType["CUSTOM_RELEASE"] = NativeBuildType.RELEASE
}
このパラメータはPodspecファイルには表示されません。XcodeがGradleビルドプロセスを実行すると、Kotlin CocoaPods Gradleプラグインが必要なネイティブビルドタイプを選択します。
NOTE
Debug
とRelease
の設定はデフォルトでサポートされているため、宣言する必要はありません。
Swift 5.5 async/awaitとの実験的な相互運用
DANGER
Swift async/awaitとの並行処理の相互運用は実験的です。これはいつでも削除または変更される可能性があります。
評価目的でのみ使用してください。YouTrackでフィードバックをいただけると幸いです。
Kotlinのsuspend関数をObjective-CおよびSwiftから呼び出すサポートを1.4.0で追加しましたが、新しいSwift 5.5機能であるasync
とawait
修飾子による並行処理に対応するために改善を進めています。
Kotlin/Nativeコンパイラは、Nullableな戻り値を持つsuspend関数に対して、生成されたObjective-Cヘッダに_Nullable_result
属性を出力するようになりました。これにより、Swiftから適切なNullabilityを持つasync
関数として呼び出すことが可能になります。
この機能は実験的であり、将来的にKotlinとSwiftの両方の変更によって影響を受ける可能性があることに注意してください。今のところ、私たちはこの機能のプレビューを提供しており、いくつかの制限がありますが、皆様からのフィードバックをお待ちしております。現在の状態について詳しく学び、このYouTrack issueでフィードバックを残してください。
オブジェクトとコンパニオンオブジェクトのSwift/Objective-Cマッピングの改善
オブジェクトとコンパニオンオブジェクトの取得が、ネイティブiOS開発者にとってより直感的な方法でできるようになりました。例えば、Kotlinに以下のオブジェクトがある場合:
object MyObject {
val x = "Some value"
}
class MyClass {
companion object {
val x = "Some value"
}
}
Swiftでそれらにアクセスするには、shared
とcompanion
プロパティを使用できます。
MyObject.shared
MyObject.shared.x
MyClass.companion
MyClass.Companion.shared
Swift/Objective-Cの相互運用について詳しく学ぶ。
MinGWターゲット向けのインポートライブラリなしのDLLへのリンクの非推奨化
LLDはLLVMプロジェクトのリンカであり、主にその優れたパフォーマンスという利点から、MinGWターゲット向けのKotlin/Nativeでデフォルトのld.bfdに代わって使用を開始する予定です。
しかし、LLDの最新の安定版は、MinGW (Windows) ターゲット向けのDLLへの直接リンクをサポートしていません。そのようなリンクにはインポートライブラリの使用が必要です。Kotlin/Native 1.5.30ではこれらは不要ですが、将来的にLLDがMinGWのデフォルトリンカになることと互換性がないことを知らせる警告を追加しています。
LLDリンカへの移行に関する皆様のご意見やご懸念を、このYouTrack issueで共有してください。
Kotlin Multiplatform
1.5.30では、Kotlin Multiplatformに以下の注目すべきアップデートがもたらされます。
共有ネイティブコードでカスタムcinterop
ライブラリを使用する機能
Kotlin Multiplatformは、プラットフォーム固有のinteropライブラリを共有ソースセットで使用するオプションを提供します。1.5.30より前は、これはKotlin/Nativeディストリビューションに同梱されているプラットフォームライブラリでのみ機能しました。1.5.30以降、カスタムcinterop
ライブラリでも使用できるようになりました。この機能を有効にするには、gradle.properties
にkotlin.mpp.enableCInteropCommonization=true
プロパティを追加します。
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)
スクリプトを更新します。
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)
}
}
}
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
値を持つもののみがビルドタイプ属性なしで公開されます。これにより、リリースバリアントは利用側で任意のビルドタイプと互換性を持つ一方、非リリースバリアントは対応する利用側のビルドタイプとのみ互換性があります。
すべてのバリアントのビルドタイプ属性を保持してオプトアウトするには、kotlin.android.buildTypeAttribute.keep=true
のGradleプロパティを設定できます。
Kotlin/JS
Kotlin/JSには1.5.30で2つの大きな改善がもたらされます。
JS IRコンパイラバックエンドがベータ版に到達
1.4.0でアルファ版として導入されたKotlin/JSのIRベースのコンパイラバックエンドがベータ版に到達しました。
以前、新しいバックエンドへのプロジェクトの移行を支援するために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バージョン向けに
UsesKotlinJavaToolchain
インターフェースでJDKホームを指定する機能が含まれます。 - KotlinデーモンのJVM引数を明示的に指定するより簡単な方法
Javaツールチェーンのサポート
Gradle 6.7では、「Javaツールチェーンのサポート」機能が導入されました。 この機能を使用すると、次のことが可能になります。
- Gradleとは異なるJDKおよびJREを使用して、コンパイル、テスト、および実行可能ファイルを実行できます。
- 未リリースの言語バージョンでコードをコンパイルおよびテストできます。
ツールチェーンのサポートにより、GradleはローカルのJDKを自動検出したり、ビルドに必要な不足しているJDKをインストールしたりできます。これにより、Gradle自体は任意のJDK上で実行でき、それでもビルドキャッシュ機能を再利用できます。
Kotlin Gradleプラグインは、Kotlin/JVMコンパイルタスクに対してJavaツールチェーンをサポートしています。 Javaツールチェーン:
JVMターゲットで利用可能な
jdkHome
オプションを設定します。ユーザーが
jvmTarget
オプションを明示的に設定しなかった場合、kotlinOptions.jvmTarget
をツールチェーンのJDKバージョンに設定します。 ツールチェーンが設定されていない場合、jvmTarget
フィールドはデフォルト値を使用します。JVMターゲットの互換性について詳しく学ぶ。kapt
ワーカーがどのJDKで実行されるかに影響します。
ツールチェーンを設定するには、以下のコードを使用します。プレースホルダー<MAJOR_JDK_VERSION>
を使用したいJDKバージョンに置き換えてください。
kotlin {
jvmToolchain {
(this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)) // "8"
}
}
kotlin {
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)) // "8"
}
}
kotlin
拡張機能を通じてツールチェーンを設定すると、Javaコンパイルタスクのツールチェーンも更新されることに注意してください。
java
拡張機能を通じてツールチェーンを設定することもでき、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>
プレースホルダーを置き換えてください。
project.tasks
.withType<UsesKotlinJavaToolchain>()
.configureEach {
it.kotlinJavaToolchain.jdk.use(
"/path/to/local/jdk",
JavaVersion.<LOCAL_JDK_VERSION>
)
}
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
ファイルでは次のようになります。noneorg.gradle.jvmargs=-Xmx1500m -Xms=500m
GradleデーモンのJVM引数に
kotlin.daemon.jvm.options
システムプロパティがある場合、以前と同様にそれを使用します。noneorg.gradle.jvmargs=-Dkotlin.daemon.jvm.options=-Xmx1500m -Xms=500m
gradle.properties
ファイルにkotlin.daemon.jvmargs
プロパティを追加できます。nonekotlin.daemon.jvmargs=-Xmx1500m -Xms=500m
kotlin
拡張機能で引数を指定できます。
kotlin {
kotlinDaemonJvmArgs = listOf("-Xmx486m", "-Xms256m", "-XX:+UseParallelGC")
}
```
```groovy [Groovy]
kotlin {
kotlinDaemonJvmArgs = ["-Xmx486m", "-Xms256m", "-XX:+UseParallelGC"]
}
```
:::
* 特定のタスクの引数を指定できます。
::: code-group
```kotlin [Kotlin]
tasks
.matching { it.name == "compileKotlin" && it is CompileUsingKotlinDaemon }
.configureEach {
(this as CompileUsingKotlinDaemon).kotlinDaemonJvmArguments.set(listOf("-Xmx486m", "-Xms256m", "-XX:+UseParallelGC"))
}
```
```groovy [Groovy]
tasks
.matching {
it.name == "compileKotlin" && it instanceof CompileUsingKotlinDaemon
}
.configureEach {
kotlinDaemonJvmArguments.set(["-Xmx1g", "-Xms512m"])
}
```
:::
::: note
この場合、タスク実行時に新しいKotlinデーモンインスタンスが起動する可能性があります。[KotlinデーモンとJVM引数の相互作用](gradle-compilation-and-caches.md#setting-kotlin-daemon-s-jvm-arguments)について詳しく学ぶ。
:::
Kotlinデーモンに関する詳細については、[KotlinデーモンとGradleでの使用方法](gradle-compilation-and-caches.md#the-kotlin-daemon-and-how-to-use-it-with-gradle)を参照してください。
## 標準ライブラリ
Kotlin 1.5.30では、標準ライブラリの`Duration`および`Regex` APIに改善がもたらされます。
* [`Duration.toString()`出力の変更](#changing-duration-tostring-output)
* [文字列からのDurationのパース](#parsing-duration-from-string)
* [特定のポジションでのRegexマッチング](#matching-with-regex-at-a-particular-position)
* [Regexをシーケンスに分割](#splitting-regex-to-a-sequence)
### Duration.toString()出力の変更
::: warning
Duration APIは[実験的](components-stability.md)です。これはいつでも削除または変更される可能性があります。
評価目的でのみ使用してください。[YouTrack](https://youtrack.jetbrains.com/issues/KT)でフィードバックをいただけると幸いです。
:::
Kotlin 1.5.30より前では、[`Duration.toString()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.time/-duration/to-string.html)関数は、最もコンパクトで読みやすい数値となる単位で表現された引数の文字列表現を返していました。
今後は、数値コンポーネントとその単位の短縮名(`d`、`h`、`m`、`s`)を組み合わせた文字列値を返します。例えば、次のようになります。
|**関数呼び出しの例**|**以前の出力**|**現在の出力**|
| --- | --- | --- |
Duration.days(45).toString()|`45.0d`|`45d`|
Duration.days(1.5).toString()|`36.0h`|`1d 12h`|
Duration.minutes(1230).toString()|`20.5h`|`20h 30m`|
Duration.minutes(2415).toString()|`40.3h`|`1d 16h 15m`|
Duration.minutes(920).toString()|`920m`|`15h 20m`|
Duration.seconds(1.546).toString()|`1.55s`|`1.546s`|
Duration.milliseconds(25.12).toString()|`25.1ms`|`25.12ms`|
負の期間の表現方法も変更されました。負の期間にはマイナス記号 (`-`) がプレフィックスとして付き、複数のコンポーネントで構成されている場合は括弧で囲まれます。例: `-12m` と `-(1h 30m)`。
1秒未満の短い期間は、単一の数値とサブセカンド単位のいずれか(例: `ms` (ミリ秒)、`us` (マイクロ秒)、`ns` (ナノ秒))で表現されることに注意してください。例: `140.884ms`、`500us`、`24ns`。科学的記数法はもはやそれらを表現するために使用されません。
期間を単一の単位で表現したい場合は、オーバーロードされた`Duration.toString(unit, decimals)`関数を使用してください。
::: note
シリアライゼーションや交換など、特定のケースでは[`Duration.toIsoString()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.time/-duration/to-iso-string.html)を使用することをお勧めします。`Duration.toIsoString()`は、`Duration.toString()`ではなく、より厳密な[ISO-8601](https://www.iso.org/iso-8601-date-and-time-format.html)形式を使用します。
:::
### 文字列からのDurationのパース
::: warning
Duration APIは[実験的](components-stability.md)です。これはいつでも削除または変更される可能性があります。
評価目的でのみ使用してください。[このIssue](https://github.com/Kotlin/KEEP/issues/190)でフィードバックをいただけると幸いです。
:::
Kotlin 1.5.30では、Duration APIに新しい関数が追加されました。
* [`parse()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.time/-duration/parse.html)。これは以下の出力のパースをサポートします。
* [`toString()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.time/-duration/to-string.html)。
* [`toString(unit, decimals)`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.time/-duration/to-string.html)。
* [`toIsoString()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.time/-duration/to-iso-string.html)。
* [`parseIsoString()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.time/-duration/parse-iso-string.html)。これは`toIsoString()`によって生成される形式からのみパースします。
* [`parseOrNull()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.time/-duration/parse-or-null.html) および [`parseIsoStringOrNull()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.time/-duration/parse-iso-string-or-null.html)。これらは上記の関数と同様に動作しますが、無効な期間形式の場合に`IllegalArgumentException`をスローする代わりに`null`を返します。
`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()
の使用例をいくつか示します。
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マッチング
DANGER
Regex.matchAt()
およびRegex.matchesAt()
関数は実験的です。これらはいつでも削除または変更される可能性があります。
評価目的でのみ使用してください。YouTrackでフィードバックをいただけると幸いです。
新しいRegex.matchAt()
およびRegex.matchesAt()
関数は、String
またはCharSequence
内の特定のポジションで正規表現が正確に一致するかどうかをチェックする方法を提供します。
matchesAt()
はブール値を返します。
fun main(){
val releaseText = "Kotlin 1.5.30 is released!"
// regular expression: one digit, dot, one digit, dot, one or more digits
val versionRegex = "\\d[.]\\d[.]\\d+".toRegex()
println(versionRegex.matchesAt(releaseText, 0)) // "false"
println(versionRegex.matchesAt(releaseText, 7)) // "true"
}
matchAt()
は、一致が見つかればその一致を返し、見つからなければnull
を返します。
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をシーケンスに分割
DANGER
Regex.splitToSequence()
およびCharSequence.splitToSequence(Regex)
関数は実験的です。これらはいつでも削除または変更される可能性があります。
評価目的でのみ使用してください。YouTrackでフィードバックをいただけると幸いです。
新しいRegex.splitToSequence()
関数は、split()
の遅延評価版です。与えられた正規表現の一致箇所で文字列を分割しますが、結果をSequenceとして返すため、この結果に対するすべての操作は遅延実行されます。
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
にも追加されました。
val mixedColor = colorsText.splitToSequence(regex)
Serialization 1.3.0-RC
kotlinx.serialization
1.3.0-RCが、 新しいJSONシリアライゼーション機能とともに登場しました。
- Java IOストリームのシリアライゼーション
- デフォルト値に対するプロパティレベルの制御
- null値をシリアライゼーションから除外するオプション
- 多様性のあるシリアライゼーションにおけるカスタムクラスディスクリミネータ
詳細については、変更履歴を参照してください。