Programmingバックエンド開発者

Kotlinにおける'inline class'(value class)とは何ですか?それは何のために必要で、どのように正しく使用するのですか?そのようなクラスにはどのような制限や特性がありますか?コードの例を示してください。

Hintsage AIアシスタントで面接を突破

答え

inline class(Kotlin 1.5以降はvalue class)は、実行時に別のオブジェクトを作成せずにプリミティブ型のラッパーを作成することを可能にします。これは、メモリアロケーションのコストをかけずにタイプセーフティを高めるために使用されます。内部では、これらのオブジェクトは対応するプリミティブにコンパイルされることがあります。

例:

@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
  • 1つのプロパティ(主フィールド)のみが許可されています。
  • 引数なしのコンストラクターは使用できません。
  • クラスは状態を持つことができません(例えば、varフィールド)、valのみです。
  • 他のクラスを継承することはできませんが、インターフェースは実装可能です。
  • Javaコードとの相互作用は明確でない場合があり、ボクシング/アンボクシングが発生する可能性があります。

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と文字列間のマッピングを明示的に行うことで修正しました。