1. 概要
inline class は Kotlin 1.3 で導入された機能で、単一の値をラップする軽量クラス を定義できます。
例えば ID・Email・PhoneNumber などを String や Int のまま扱うと混同しやすいですが、専用の型にすることで安全に管理できます。
-
型安全:同じ
StringでもEmailとPhoneNumberを区別できる - パフォーマンス:コンパイル時にインライン化され、余計なオブジェクトを生成しない
2. 定義方法
Kotlin 1.3〜1.4(旧: inline class)
inline class Email(val value: String)
inline class UserId(val id: Int)
Kotlin 1.5 以降(新: value class)
@JvmInline
value class Email(val value: String)
@JvmInline
value class UserId(val id: Int)
注意:
-
inline classは Kotlin 1.5 以降 非推奨 - 代わりに
value classが正式 に使われます
3. 使用例
@JvmInline
value class UserId(val id: Int)
fun getUserName(userId: UserId): String {
return "User #${userId.id}"
}
fun main() {
val userId = UserId(100)
println(getUserName(userId)) // User #100
}
実行時には UserId はただの Int として扱われ、余分なオブジェクト生成は行われません。
4. 制約
- フィールドは 1つのみ
-
継承できない(
open/abstract/sealedは不可) -
initブロックなし(バリデーションはファクトリ関数で行う) -
UserId?のような nullable 型はボックス化 される場合がある
5. よくある用途
- 型安全な ID(例:
CustomerId,OrderId) - 単位付きの値(例:
Meter,Second) - API 層とドメイン層での型区別
まとめ
-
inline class= Kotlin 1.3 で導入された軽量ラッパー(すでに非推奨) -
value class= Kotlin 1.5 以降の正式版。今後はこちらを使うべき