はじめに
Kotlin 2.4.0がリリースされました!
そこで本記事では、Kotlin 2.4.0で追加・Stable化された変更点のうち、Android開発で利用機会がありそうなものを中心に紹介します。
Kotlin/Native、Wasm、Swift Exportなど、Android開発では利用機会が少ないものは割愛しています。
1. Context ParametersがStable化
Kotlin 2.4.0では、Context ParametersがStableになりました。
これまではExperimentalだったため実務での採用には慎重になる必要がありましたが、今後はライブラリやフレームワーク側でも採用が進む可能性があります。
従来
class Logger
fun printLog(logger: Logger) {
// ...
}
Kotlin 2.4.0
context(logger: Logger)
fun printLog() {
// ...
}
依存するオブジェクトを毎回通常の引数として渡さずに、関数が必要とするコンテキストとして定義できます。
Androidアプリですぐに置き換える場面は多くないかもしれませんが、DIやCompose向けライブラリなどで利用される可能性があります。
2. Explicit Backing FieldsがStable化
Kotlin 2.4.0では、Explicit Backing FieldsがStableになりました。
Android開発では、ViewModelでMutableStateFlowを内部に保持し、StateFlowとして外部公開する実装をよく使います。
従来
private val _uiState = MutableStateFlow(UiState())
val uiState: StateFlow<UiState> = _uiState
Kotlin 2.4.0
val uiState: StateFlow<UiState>
field = MutableStateFlow(UiState())
外部にはStateFlowとして公開しつつ、内部ではMutableStateFlowとして扱えます。
_uiStateとuiStateの2つのプロパティを定義する必要がなくなるため、ViewModel周りのボイラープレートを減らせます。
今回の変更の中では、Android開発で特に利用機会が多そうな機能です。
3. UUID APIがStable化
UUID APIがStableになりました。
import kotlin.uuid.Uuid
val id = Uuid.random()
UUIDをKotlin標準ライブラリのAPIとして扱えるようになります。
Androidではjava.util.UUIDを利用することも多いため、すぐに大きく実装が変わるわけではありませんが、マルチプラットフォームを意識したコードでは使いやすくなりそうです。
なお、UUID v4やUUID v7に関する一部APIは、引き続きExperimentalです。
4. Map Fallback Functionsが追加
nullableな値を持つMap向けに、Fallback Functionsが追加されました。
従来のMapアクセスでは、次の2つを単純な取得結果だけでは区別できません。
- キーが存在しない
- キーは存在するが値がnull
val map = mapOf(
"name" to null
)
val value = map["name"]
この場合、取得結果はnullになります。
Kotlin 2.4.0で追加されたFallback Functionsを利用することで、キーが存在しない場合の処理を明示しやすくなります。
APIレスポンスや設定値など、nullと未設定を区別したい場面で役立ちそうです。
5. Collection Literalsが追加
Collection LiteralsがExperimentalとして追加されました。
従来は次のように記述していました。
val list = listOf(
"A",
"B",
"C"
)
Collection Literalsでは、次のような記法を利用できます。
val list = ["A", "B", "C"]
配列やコレクションを簡潔に記述できるようになります。
ただし、Kotlin 2.4.0時点ではExperimentalです。
実務で積極的に採用する段階ではありませんが、今後のKotlinの記法に影響しそうな変更として押さえておいてよさそうです。
6. Sorted APIが追加
コレクションがソート済みかどうかを判定するAPIが追加されました。
list.isSorted()
list.isSortedDescending()
list.isSortedBy(User::age)
従来は、ソート後のコレクションと比較する方法などが使われていました。
list == list.sorted()
専用APIが追加されたことで、処理の意図が分かりやすくなります。
利用頻度はそれほど高くないかもしれませんが、入力値の検証やテストコードでは使いやすそうです。
7. その他の変更
Android開発に関連しそうな変更として、次のようなものがあります。
- Java 26への対応
- Annotation Metadataのデフォルト有効化
- Gradle 9.5への対応
日常的なアプリコードに直接影響する変更ではありませんが、ビルド環境やライブラリ開発では確認しておきたい内容です。
まとめ
Kotlin 2.4.0では、既存のコードを大きく変える機能というより、Kotlinの記述を整理しやすくする変更が多く含まれています。
Android開発で特に利用機会が多そうなのは、次の機能です。
- Explicit Backing Fields
- Context Parameters
- UUID API
- Sorted API
特にExplicit Backing Fieldsは、ViewModelでStateFlowを扱うコードを簡潔にできるため、Androidエンジニアにとって影響の大きい変更になりそうです。
Collection LiteralsのようにExperimentalの機能も含まれているため、Stableな機能と分けて確認しながら利用するのがよさそうです。
さいごに
毎日暑すぎるので、熱中症にはお気をつけください…!