Kotlin のインライン クラスを使用すると、単一の値をカスタム型でラップして、コードの安全性と可読性を向上させることができます。通常のクラスとは異なり、インライン クラスはコンパイラによって「インライン化」されるため、実行時のオーバーヘッドが追加されません。つまり、実行時に実際のオブジェクトが作成されません。この記事では、インライン クラスを使用する理由と場所、タイプエイリアスとの違いについて説明し、例も示します。
タイプ セーフティ: インライン クラスは、類似したデータ型の誤った使用を防ぐのに役立ちます。たとえば、UserId と ProductId はどちらも文字列として表すことができますが、これらは交換可能な概念ではありません。インライン クラスは、コンパイル時に異なる型のままであることを保証します。
ランタイム パフォーマンス: インライン クラスを使用すると、Kotlin はラップされた値を可能な限りインライン化することで、ラッパー オブジェクトを作成する必要性を排除します。これにより、ID、コード、識別子などの小さな値を渡すことが多いパフォーマンスの効率が向上します。
可読コード: インライン クラスは、一般的な値に意味のある名前を付け、コードをよりわかりやすく、理解しやすくします。
Kotlin でインライン クラスを定義するには、値クラスとともに @JvmInline アノテーションを使用し、それに val プロパティが 1 つだけ含まれていることを確認します。
@JvmInline value class UserId(val id: String) @JvmInline value class ProductId(val id: String) fun fetchUser(userId: UserId) { println("Fetching user with ID: ${userId.id}") } fun main() { fetchUser(UserId("1")) // OK fetchUser(ProductId("1")) // NOT OK. Even though inlined type is String }
上記の例では、UserId と ProductId は String をラップするインライン クラスです。基になる型 (String) が同じであっても、Kotlin はそれらを別個の型として扱い、偶発的な混同を防ぎます。
インライン クラスは、次のような場合に特に役立ちます。
typealias は、新しい型を作成せずに型に意味を追加するもう 1 つの方法です。ただし、インライン クラスとは異なり、typealias はコンパイル時に実際の型安全性を持たずにエイリアスを作成するだけです:
typealias UserId = String typealias ProductId = String fun printProductId(id: ProductId) { println("Product ID: $id") } // The following would compile, even though it's an incorrect usage. val userId: UserId = "user_id" printProductId(userId) // Will print Product ID: user_id
typealias では、UserId と ProductId は単なる String のエイリアスであるため、Kotlin はこれらを交換可能なものとして扱い、偶発的な誤用の危険性があります。インライン クラスは、コンパイル時に UserId と ProductId に個別の型を作成することで、この問題を回避します。
Kotlin のインライン クラスは、型安全性を追加し、コードの可読性を向上させ、値の軽量ラッパーのパフォーマンスを最適化する堅牢な方法を提供します。これらは、不必要なオブジェクト割り当てを作成する識別子や小さな値に特に役立ちます。インライン クラスを使用すると、実行時のオーバーヘッドを発生させずにコンパイル時の安全性を確保できるという、両方の長所を得ることができます。
以上がKotlin のインライン クラス: なぜ、どこで、どのように使用するのかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。