inline class(Kotlin 1.5以降はvalue class)は、実行時に別のオブジェクトを作成せずにプリミティブ型のラッパーを作成することを可能にします。これは、メモリアロケーションのコストをかけずにタイプセーフティを高めるために使用されます。内部では、これらのオブジェクトは対応するプリミティブにコンパイルされることがあります。
例:
@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
inline/valueクラスの使用は、識別子、金額、測定単位などの型付けに重要です。
value classは1つ以上のプロパティを持つことができますか?
答え: いいえ。Value classは、主コンストラクター内で1つのプロパティのみを持つことができます。
間違ったコードの例:
@JvmInline value class Money(val amount: Int, val currency: String) // コンパイルエラー
物語
為替所では、金額と通貨を説明するためにinline classを使用しました。value classに2つのフィールドを追加しようとしたところ、コンパイルエラーが発生し、その制限を回避する試みを行うのに時間を費やしました。最終的に、別のdata classを作成することにしました。
物語
外部Javaライブラリとの統合中に、inline classが予期せずオブジェクト(ボクシング)に変換され、パフォーマンスに影響を与えました。ドキュメントを分析した後、通常のvalueオブジェクトに置き換えました。
物語
マイクロサービスプロジェクトで、APIの識別子としてvalue classを使用していました。1つのサービスは文字列を直接返し、別のサービスはvalue classを返したため、Jacksonでシリアライズの競合が発生しました。idと文字列間のマッピングを明示的に行うことで修正しました。