Kotlin 1.4.3プレビュー機能まとめ
Kotlin 1.4.3で新機能プレビューが発表されので中身をまとめてみたいとおもいます。今はプレビューですがKotlin1.5.0では正式になるとかなんとか。そんなに大きな変更ではありません。
sealed interface
sealed class
の interface バージョン。殆どの用途では sealed interface になるでしょう。
sealed interface Shape class Rectangle(): Shape class Circle(): Shape
見た目もほぼ一緒。明示的にクラスとしてゴリゴリでなければinterfaceで十分だと思います。
sealed classをパッケージ単位に
今までsealed-classとそれの継承クラスは同一ファイルである必要があったのですが、それが同一モジュール/同一パッケージに拡張。
visibilityとあったので「そのファイル固有のsealed」もいけるかも?(未検証)
Serialization変更
- inline classサポート
- inlineでSerialize
- Unsigned系サポート
JVM record サポート
JDKで試験的に追加されている record
への対応です。Kotlinでいう data class
ですね。以下のようにannotationをつけることで Java から record として見えます。
@JvmRecord data class Rectangle(val width: Int, val height: Int)
とはいえAndroidでは使わない(使えない)機能ですね...サーバサイド向けでしょう。
inline class変更
inline
に変わり value
という修飾子が登場。将来的に inline
はdeprecateになるらしいです。また @JvmInline
をJavaのときはつけることになる模様(必須?オプション?)。
inline class Name(private val s: String) @JvmInline value class Name(private val s: String)
またJava側から「inlineクラスを引数にする関数」を呼び出せるように。ただしアノテーションが必要です。
value class UInt(val x: Int) fun compute(x: Int) { } @JvmName("computeUInt") fun compute(x: UInt) { }
JVM IR backend
IR(intermediate representation)をベースにしたコンパイラがベータに。JS向けはAlphaのまま。(ともに1.4.0でAlpha)
パフォーマンスがよくなるらしいです。
compileKotlin { kotlinOptions.useIR = true }
Kotlin/Native
箇条書きで
- パフォーマンス改善
- WatchOS64bitサポート
- Xcode12.2のライブラリサポート(なんのこと?これしか書いてない)
Kotlin/JS
- トップレベルプロパティのlazyサポート
Gradle
- GradleConfigurationをキャッシュするように
- ビルドが早くなる
標準ライブラリ変更
toUpperCase系改善
- locale次第で挙動が変わるので、新メソッド用意
- トルコだと
"kotlin".toUpperCase()
がKOTLİN
になってたらしい
Old | New |
---|---|
String.toUpperCase() | String.uppercase() |
String.toLowerCase() | String.lowercase() |
String.capitalize() | String.replaceFirstChar { it.uppercase() } |
String.decapitalize() | String.replaceFirstChar { it.lowercase() } |
char
- Char.toInt()が紛らわしいので改善です
"4".toInt() //4 '4'.toInt() //52
- Charコードが文字の数値表現のどちらか混乱を招くため
class Char { // Charコード関係の処理 constructor(code: Int) val code: Int //'4'.code==52 //数値表現 fun digitToInt(radix: Int): Int fun digitToIntOrNull(radix: Int): Int? } //Int側から fun Int.digitToChar(radix: Int): Char
以上です。そんなに大きな変更ではないですね。まだ試せてませんがJVM-IRがちょっと楽しみです。