序文
最近、kotlin1.6.20 の新しいバージョンがリリースされ、いくつかの便利な機能が追加されました。試してみましょう
文章
1. マルチレシーバー拡張機能
kt の拡張機能は誰もが理解しているはずですが、レシーバーとは? たとえば、次のコードは View 用に拡張されており、View はレシーバーの型で、this@click はレシーバー オブジェクトです。
fun View.click(onClick: (View) -> Unit) {
setOnClickListener {
onClick(this@click)
}
}
また、複数の受信者が複数の this 型とオブジェクトを追加できますが、その用途は何ですか?
たとえば、クリックイベントが実行されたときにコルーチンで実行される拡張関数 View.clickSuspend を定義すると、ライフサイクルのスコープを使用でき、次のように記述できます。
しかし、この clickSuspend 関数は BaseActivity でしか定義できません.lifecycleScope は LifecycleOwner の拡張属性であり、LifecycleOwner と View は弊社では変更できないため、Fragment で使用する場合は、BaseFragment で再度定義する必要があります(実際の状況)さらに悪い場合があります (親クラスを変更できません))。現時点では、次の図に示すように、複数のレシーバー拡張関数を使用してこれを実現できます。
そのうち、View はメインのレシーバーであり、コンテキスト内の LifecycleOwner (LifecycleOwner) はサブレシーバーであり、複数持つことができます. メインのレシーバーはクラスに関数を明示的に追加するために使用され (セマンティック)、サブのレシーバーはare only implicit and must have Only the environment can prompt this method. たとえば、上記の例で View と LifecycleOwner を逆にすると、メソッドは見つかりません。
このうち、this@method name は取得するメインのレシーバーで、this@LifecycleOwner などは対応するサブのレシーバーを取得します。
次の問題があるため、この機能は手動で有効にする必要があり、オンライン プロジェクトでの使用は推奨されません。
ps: Kotlin は、この機能を有効にするコンパイル パラメーターを追加します。
//Groovy
kotlinOptions {
jvmTarget = '1.8'
freeCompilerArgs = ["-Xcontext-receivers"]//this
}
//Kts
freeCompilerArgs = listOf("-Xcontext-receivers")
2.決してnull型ではない
絶対に制御できない型とは、実はkt型の脆弱性を補うようなものだと思います公式サイトのコード例を見てみましょう
この空でない型がジェネリック型を変更するために使用されていることがわかります. ジェネリック型の後に &Any を追加すると、パラメーターまたは戻り値が確実に空にならないことを示すことができます (この &Any は、テスト後に固定された組み合わせです)。
実際、機能は場合によっては非常に便利ですが、単純で一般的に使用される例を期待していませんでした 2333...
追記: この機能を有効にするには、バージョン 1.7 を手動で有効にするか、バージョン 1.7 が正式に有効になるまで待つ必要があります。
kotlin {
sourceSets.all {
languageSettings {
languageVersion = '1.7'
}
}
}
3. kotlin を並行してコンパイルしてコンパイル時間を短縮する
Compilation parameters plus the following line can enable parallel compilation of kotlin. gradle コンパイルで kotlin 単一モジュールが時間のかかるタスクである場合、それを有効にすると、コンパイル時間が約 15% 短縮されます。
ps: N が 0 の場合は、CPU コアごとに並列スレッドが割り当てられることを意味し、それ以外の数は指定した数です.CPU コアの数を超えないようにしてください。
-Xbackend-threads=N
その他は通常使用されない機能で、これら 3 つは将来的に使用される可能性があります。