JetBrainsがKotlin 1.6.0をリリースした。StableになったKotlin 1.5.30の言語と標準ライブラリ機能が付属する。新しい言語機能のひとつがsealed when
文だ。
sealed class Employee {
data class Developer(val languages: List<String>) : Employee()
data class Operations(val operatingSystems: List<String>) : Employee()
}
fun printInformation(employee: Employee) {
when (employee) {
is Employee.Developer -> printLanguages(employee.languages)
}
}
Kotlinはすでに、sealedクラス、enum、Boolean型を対象として、網羅性(exhaustiveness)検証を備えたwhen
式を提供している。網羅性のないwhen
文の使用は、Kotlin 1.7ではエラーになる予定だが、Kotlin 1.6.0は次のような警告を表示するようになる。
Non exhaustive 'when' statements on sealed class/interface will be
prohibited in 1.7, add 'is Operations' branch or 'else' branch instead
コルーチンが、スーパータイプとしてsuspend
関数型の実装をサポートするようになった。これまでは、目的の動作としてラムダとsuspend関数参照のみが使用可能だったが、今後は別のクラスをsuspend関数型の実装に使うことができるようになる。
class OrderManager : suspend () -> Unit {
override suspend fun invoke() { ... }
}
fun buy(action: suspend () -> Unit) {}
通常の関数からsuspend関数型への変換は、従来は関数リテラルとCallable Referenceに限定されていたが、任意の形式への暗黙的変換が行われるようになった。これにより、通常の関数をsuspend型のパラメータとして使用できるようになる。
val regularFunction = ::function
flow.collect(regularFunction)
typeパラメータの上限に基づいた、再帰的なジェネリック型の型推論が可能になった。
標準ライブラリの変更点のひとつであるreadln()
は、readLine()!!
の代替として、ファイル終端で例外をスローする。同じようにreadInOrNull()
は、ファイル終端でnull
を返すreadLine()
の代わりに使うことができる。
typeOf()
関数はJVMプラットフォームの試験的APIとしてすでに利用可能であったが、公式に全プラットフォームで使用できるようになった。
buildList()
、buildMap()
、buildSet()
などのコレクションビルダがStableになり、シリアライズ可能なコレクションを読み取り専用で返すようになった。
DurationAPIのtoComponents()
関数が、日数としてInt
値の指定を受け入れるようになり、大きな値を使用する場合の問題が解決した。に代えて
LongDurationUnit
列挙子は、必要性がないという判断から、JVMのjava.util.concurrent.TimeUnit
のタイプエイリアスではなくなった。Int.seconds
などの拡張プロパティが、スコープを制限するためにDuration
クラスのCompanion経由で提供されるようになった。
その他Stableになった関数としては、整数値のビットローテーションを行うrotateLeft()
とrotateRight()
、正規表現に基づいて文字列を分割するsplitToSequence()
、中置記法(infix notation)で使用可能になったComparable.compareTo()
、グループ参照でJVMやJSと同じ結果を得られるようになったreplace()
とreplaceFirst()
などがある。
Kotlin 1.6.0では、過去3つのAPIバージョンと現在のStableなバージョンでの開発が可能になっており、現時点では1.3、1.4、1.5、1.6が対象である。
Kotlinの@kotlin.annotation.Repeatable
がJavaとコンパチブルになり、リテンションの受け入れと繰り返し使用が可能になった。JavaのRepeatableアノテーションをkotlinで使用することもできる。
ネイティブプラットフォームとJVMプラットフォームの技術的な差異の解決を目的として、用途を評価目的に限定したメモリマネージャの新たな実験バージョンが提供されている。これを使うことで、開発者によるアノテーションや他のコンフィギュレーションの必要なく、リークのないコンカレントプログラミングプリミティブが可能になる。Kotlin/NativeがXcode 13もサポートするようになり、Kotlin/Nativeをサポートするすべてのホスト上でWindowsをターゲットとするコンパイルが可能になった。
Kotlin/JSプロジェクトでのNode.jsとYarnのダウンロードを、すでにインストールされている場合には無効にできるようになった。
Kover Gradleプラグインを使って、Kotlin JVMコンパイラで構築されたKotkinコードのカバレッジを測定できるようになった。Koverプラグインがリリースされるまでは、GradleツールチェーンやマルチプラットフォームプロジェクトにJaCoCoなどが統合されていなかったことから、コードカバレッジの測定が難しかった。
Kotlinのドキュメントには、今回のリリースの変更点に関するすべての概要が、例を含めて記載されている。