0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Kotlin】value class(値型クラス)について解説します

Last updated at Posted at 2025-09-15

はじめに

Kotlin の value class は、旧来の inline class の進化版・正式版です。Kotlin 1.5 から正式リリースされ、inline class は非推奨になりました。


1. 定義方法

@JvmInline
value class UserId(val id: Int)

@JvmInline
value class Email(val value: String)
  • @JvmInline アノテーションは JVM との相互運用のために必須
  • 中身は 単一プロパティのみ(複数は不可)

2. 仕組み

  • 通常のクラスのように型安全性を提供
  • 実行時には ラップされずに中身の値にインライン化 される(パフォーマンス◎)
  • UserIdInt として扱われるが、型レベルで Int と区別可能

3. 使用例

@JvmInline
value class UserId(val id: Int)

fun greet(userId: UserId) {
    println("Hello, user #${userId.id}")
}

fun main() {
    val userId = UserId(42)
    greet(userId)  // Hello, user #42
}

実行時には UserId のオブジェクト生成はなく、ただの Int として扱われる。


4. 制約

  • フィールドは 1つだけ
  • 継承できないopen / abstract / sealed は不可)
  • init ブロックなし(バリデーションはファクトリメソッドで実装する)
  • nullable の場合はボックス化される
    UserId? はオブジェクトとして扱われる可能性あり。

5. よくある用途

  • 型安全な ID

    value class CustomerId(val value: Int)
    value class OrderId(val value: Int)
    

    Int の混同を防ぐ。

  • 単位付きの値

    value class Meter(val value: Double)
    value class Second(val value: Double)
    

    MeterSecond を区別して計算できる。

  • ラッパーで意味を明確化

    value class Email(val value: String)
    value class PhoneNumber(val value: String)
    

6. inline class との違い

項目 inline class (旧) value class (新)
Kotlin バージョン 1.3〜1.4 1.5〜正式版
定義方法 inline class value class
JVM 互換性 不安定 @JvmInline で安定
推奨度 非推奨 ✅ 正式に使用可能

まとめ

Kotlin 1.5+ では value class を使うのが正解です。
inline class は古いコードのために残ってるだけと思ってOKです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?