ウェブサイト検索

Kotlin 1.6の新機能は何ですか?


Kotlin 1.6が新しい機能、改善された実験的メモリーマネージャー、および強化された標準ライブラリを備えてリリースされました。これらの追加は、JetBrainsのますます人気が高まっているクロスプラットフォームおよびクロスディシプリン言語を成熟させるのに役立ちます。

新しいネイティブメモリマネージャー

Kotlinエコシステムにとって最大の変化は、Kotlin Nativeの新しいメモリマネージャの登場です。まだ開発者プレビューとしてラベル付けされていますが、更新されたマネージャはKotlinが今後取る方向性を示しています。

改訂されたデザインは、KotlinをiOSおよびAndroidのネイティブプラットフォームコードに変換するために使用されるさまざまなコンパイルバックエンドに対応するための準備が整っています。プラットフォームによっては、特定の操作に対して異なる最適化が必要な場合があります。現在のアプローチは同時実行性に制限を課し、特別な開発者の注意なしにメモリリークを引き起こす可能性があります。

次世代のメモリーマネージャーは、これらの欠点に対処します。これにより、既存のままで安全に使用できる並行操作のためのリークのないプリミティブが提供されます。変更はまた、JVM開発の既存のメモリーマネージャーとネイティブメモリ管理の間の整合性を高めます。

新しいシステムはKotlin 1.6で利用可能ですが、現時点では本番環境での使用を目的としていません。一部の状況では、従来のメモリーマネージャーと比較してパフォーマンスが最大5倍低下する可能性があります。一般的な利用に向けたパフォーマンスの良いバージョンの開発は継続中です。

封印された時の声明

封印された

when

ステートメントは、可能性のあるケースを処理し忘れたときにコンパイラ警告を受け取ることができるようにします。シールドクラス、ブール型、または列挙型を渡すときに、

when

通常、各可能な入力値に対して明示的な行動を取ることを望むでしょう:

sealed class Drivetrain {

data class Electric(val Power: Int) : Drivetrain()

data class Diesel(val Power: Int) : Drivetrain()

data class Hybrid(val Diesel: Drivetrain, val Electric: Drivetrain) : Drivetrain()

}

fun getTotalPowerKwh(drivetrain: DriveTrain) : Int {

when (drivetrain) {

is Drivetrain.Diesel -> drivetrain.Diesel.Power

is Drivetrain.Electric -> drivetrain.Electric.Power

}

}

上記の例では、

Drivetrain

シールドクラスには、その中に3つのデータクラスがあります。

when

そのステートメントはそれらの2つだけを処理します - あなたのコードがハイブリッドドライブトレインを受け取ると、正しくない値が返されます。

Kotlinコンパイラは、これに関して警告を出すようになります。Kotlin 1.7では、すべての可能性を網羅していない場合、コンパイルエラーが発生します。

サスペンデッドタイプ変換

通常型からサスペンディング型への変換は、自動コンパイラ変換により安定化されています。通常型の式をサスペンディング型が期待されるコンテキストに渡すと、コンパイラが自動的に変換を行います。

これにより、次のようなコードが可能になります。

fun createUser(name: String) {

// ...

}

flow.collect(::createUser)

val createUserFunction = ::createUser

flow.collect(createUserFunction)

このコードは二行目で壊れていました

flow.collect()

電話してください。

createUserFunction

変数は通常の関数定義を指し、最初の呼び出しによって作成されたサスペンションではありません。Kotlinは、受け取るコンテキストがそれを必要とする場合にサスペンデッドバージョンを作成することでこれを処理します。

サスペンド関数は、スーパタイプとしてもサポートされています。これにより、サスペンド関数の参照が現在サポートされている場所で、サスペンド関数型を実装しているクラスを渡すことができます。

class ImplementsSuspendingFunctionalType : suspend () -> Unit {

override suspend fun invoke() { /* ... */ }

}

その

suspend () -> Unit

インターフェースは、すでに使用できるのと同じ方法で実装されています。

() -> Unit

非停止型のために。

コードカバレッジスキャナー

Kotlinには公式のコードカバレッジスキャンツールが登場しました。Koverは、Kotlin JVM、マルチプラットフォーム、および混合Javaプロジェクトのテストのカバレッジ統計を収集するGradleプラグインです。HTMLおよびXML形式でレポートを生成することができます。

KoverはKotlin言語とそのGradleツールチェーンとの完全な互換性を提供します。一部のサードパーティツールはすでにカバレッジスコアを提供できますが、それらはエコシステムの外に存在し、すべてのタスクを常に把握しているわけではありません。Koverは完全に統合されたアプローチを提供します。この初期リリースは実験的としてラベル付けされており、開発は進行中です。

Koverを有効にするには、最上位のビルドファイルに以下の行を追加してください:

plugins {

id("org.jetbrains.kotlinx.kover") version "0.4.2"

}

KoverはこれからあなたのGradleビルドの一部として実行されます。

標準ライブラリの追加

標準ライブラリにはいくつか注目すべき変更があり、いくつかのベータ機能が安定版に昇格しています。

readln() と readlnOrNull()

これらの2つの新しい関数は、標準入力ストリームから行を読み取り、返します。前者はEOFマークに達した場合に例外をスローしますが、後者はnullを返します。

typeOf()

この typeOf() 関数を使うことで、通常 T として表現される具体的な型を実行時に確認することができます。

inline fun <reified T> getTypeString() : String {

val type = typeOf<T>()

return type.toString()

}

コレクションビルダーズ

新しいビルダーファンクションを使うことで、異なる値のセットからコレクションを簡単に作成できます。ファーストクラスの関数を使用して、マップ、リスト、セットを新しいコレクションに組み合わせることができます:

val fruits = listOf("apple", "banana");

val veg = listOf("carrot", "cabbage");

val groceries = buildList {

add("milk")

addAll(fruits)

addAll(veg)

}

// ["milk", "apple", "banana", "carrot", "cabbage"]

期間値

Duration クラスは時間値を表現するために安定版に昇格しました。これは、コード内で時間の期間を保存するための統合型を提供します。このクラスには、単位間の簡単な変換を容易にするメソッドがあります:

// Emits 1.0

println(60.toDuration(DurationUnit.SECONDS).inMinutes);

標準ライブラリのさらなる変更

整数には新しい rotateLeft() と rotateRight() 関数があります。これらは指定されたビット数だけ数値の二進数表現を指定された方向に回転させます。正規表現はシーケンス分割機能を得て、Java と JavaScript 環境全体で replace() と replaceFirst() の一貫した動作を持ちます。

いくつかの既存の関数が非推奨になりました。文字列の concat()、match()、および matches() 関数、ならびに配列の sort() 関数は、今後警告を発します。その機能はすでに代替のオプションによってカバーされています。

その他の変更

Kotlin 1.6は、いくつかのエコシステムの向上と生活の質の改善を追加します。これには、Xcode 13のサポートや、任意のプラットフォームでWindowsビルドをコンパイルできる機能が含まれています。Windows向けにmingwX64またはmingwX86をターゲットにしている場合は、Kotlin/Native開発をサポートする任意のシステムからコンパイルできるようになりました。

LinuxおよびiOSビルドのためのコンパイラキャッシュの改善により、初回実行後の典型的なビルド時間が半分になりました。Kotlin依存関係チェーンの更新により、ディスク使用量が大幅に削減されました。LLVM 11.1への切り替えにより、macOS版のサイズが1200 MBから約300 MBに減少しました。

Kotlin JavaScriptを使用している場合、ビルドプロセス中にNode.jsとYarnの自動ダウンロードを無効にすることができるようになりました。これは、ホストがすでにこれらの依存関係をインストールしている事前設定された環境でコードをコンパイルする場合に便利です。

要約

Kotlin 1.6は、新しい実験的機能が前進の道を切り開き、今日使える言語と標準ライブラリの変更が豊富に含まれた健全なリリースです。また、Kotlinのフレーバー間の相互運用性も改善され、JVM、ネイティブ、またはJavaScript用にコンパイルされるかどうかにかかわらず、より多くのコードが同じように動作するようになります。

1.6のマイルストーンでは、Kotlinのメンテナーが古いAPIバージョンの延長サポート期間を提供しています。これまでの3つのバージョンが、今後はロールベースでサポートされることになります。つまり、現在はKotlinのバージョン1.3から1.6の間で開発を選択できるため、リリース間のアップグレードにより多くの時間を持つことができます。

今日、IntelliJ IDEA、Android Studio、Xcode、またはKotlin CLIコンパイラーのバージョンを更新することで、Kotlin 1.6に移行できます。最初に互換性ガイドを確認して、1.6で警告やエラーを引き起こす以前に報告されたすべての非推奨項目に対処していることを確認する価値があります。

関連記事: