引用:https://kotlinlang.org/docs/whatsnew15.html#inline-classes

引用:https://kotlinlang.org/docs/inline-classes.html

今まで

今まではinline classでしたが、kotlin1.5からはvalue classに変更になります。inline classはdeprecatedになります。

使い方

@JvmInline
value class User(val id: String)

上記のように使います。但し条件があって

  • 単一のプロパティしか持てない
  • valのみしか持てない
  • 参照の比較ができない(===で比較できない)
  • Javaから直接使えない(オールKotlinプロジェクトではない場合は注意)

data classと何が違う?

これだけだとdata classと何が違うのかわからないのですが、value classを使うとdata classよりパフォーマンスが良いです。よって単一のプロパティのみの場合はvalue classを使う、それ以外はdata classを使えば良いと思います。

typealiasで同じことできるけど?

typealias UserId = Int

fun changeUserId(userId: UserId) {
    // ...
    println(userId)
}

fun main() {
    val userId: UserId = 0
    changeUserId(userId)
    
    val intUserId: Int = 1
    changeUserId(intUserId)
}

https://pl.kotl.in/HYoV8l5k1

fun changeUserId()はUserId型の引数を期待していますが、Int型を渡しても動いてしまいます。これは実装を強制しているのに別の型も渡せてしまうためバグの温床になります。UserId型で渡すようにしましょう。

//typealias UserId = Int
@JvmInline
value class UserId(val userId: Int)

fun changeUserId(userId: UserId) {
    // ...
    println(userId)
}

fun main() {
    val userId: UserId = UserId(0)
    changeUserId(userId)
    
    val intUserId: Int = 1
    changeUserId(intUserId)	// compile時error
}

https://pl.kotl.in/Z6bhnLjMa

このようにコンパイル時に型が合わないため、エラーとなります。アプリ実行前に間違った引数を渡していることがわかるのでtypealiasよりvalue classを使うようにしましょう。