プログラマ英語学習日記

プログラミングと英語学習のまとめなど

Kotlin 1.4.3プレビュー機能まとめ

Kotlin 1.4.3で新機能プレビューが発表されので中身をまとめてみたいとおもいます。今はプレビューですがKotlin1.5.0では正式になるとかなんとか。そんなに大きな変更ではありません。

一番影響大きそうなのはJVM向けコンパイラでしょうか。

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になるらしいです。また @JvmInlineJavaのときはつけることになる模様(必須?オプション?)。

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がちょっと楽しみです。