Kotlin最新アップデートまとめ ──委譲プロパティやインラインクラスに関するアップデート
【最新Kotlinアップデート解説】バージョン1.1からの変更点総まとめ 第4回
インラインクラスの導入
クラスやインターフェースに関する変更点の最後に紹介するのは、インラインクラスです。
インラインクラスとは
インラインクラスは、バージョン1.5で新たに導入された仕組みであり、英語での正式名称は、Inline Value Classesとvalueが入ります。そのため、第2回で紹介したインライン関数や前回紹介したインラインプロパティとは、少し仕組みが違います。
とはいえ、何かが埋め込まれるために「インライン」という名称が使われており、その埋め込まれるものが値=valueであることから、先の英語の名称となっています。
インラインクラスは、ただひとつの読み取り専用の値を保持するためだけのクラスです。そのため、保持している値に対して別名をつけるようなイメージであり、そのような場合に有効です。
このような仕組みから、クラス構文は、例えばリスト10のようになります。このクラスは、ホワイトレディカクテルの金額のみを保持するためのクラスです。そして、その金額=Int型の値にWhiteLadyPriceという名称を与え、以降は、WhiteLadyPrice型として扱われるようになります。
@JvmInline // (1) value class WhiteLadyPrice(val price: Int) // (2)
インラインクラスの特徴としては、リスト10の(2)のように、クラス宣言にvalueキーワードを付与します。そして、ただひとつの読み取り専用の値を保持するために、valプロパティをひとつだけ宣言し、コンストラクタの引数とします。このことから、インスタンス生成時にその値を受け取り、それを読み取り専用として保持するクラスとなります。
なお、このインラインクラスをJVM上で利用する場合は(1)の@JvmInlineアノテーションが必要となります。といっても、ほとんどのKotlinコードはJVMでの動作を前提としているので、実質このアノテーションは必須と言えます。
インラインクラスに記述できるもの
インラインクラスは、ある値に対して別名とその名称のデータ型を付与するような仕組みであり、型エイリアスのように思えるかもしれません。
しかし、インラインクラスには、valプロパティ以外に以下のメンバが定義でき、これが型エイリアスではなしえないインラインクラスの特徴です。
- initブロック
- セカンダリコンストラクタ
- 算出プロパティ
- 通常メソッド
これらをWhiteLadyPriceに追記したサンプルコードは、リスト11のようになります。
@JvmInline
value class WhiteLadyPrice(val price: Int) {
init { // 1
println("WhiteLadyPriceが${price}円で生成されました。")
}
constructor(price: Int, creator: String): this(price) { // 2
println("WhiteLadyPriceが${creator}さんによって${price}円で生成されました。")
}
val priceStr: String // 3
get() {
return "${price}円"
}
fun showPrice() { // 4
println("WhiteLadyPriceの金額は${priceStr}です。")
}
}
このうち、2のセカンダリコンストラクタが定義できるようになったのは、バージョン1.9からで、比較的新しい仕組みです。
インラインクラスはインターフェースの実装が可能
インラインクラスは、インターフェースを実装することも可能です。例えば、リスト12のインターフェースCocktailPriceがあるとします。
interface CocktailPrice {
fun showPrice()
}
このCocktailPriceインターフェースを実装したインラインクラスは、リスト13のようにshowPrice()をオーバーライドする必要があります。
@JvmInline
value class XYZPrice(val price: Int) : CocktailPrice {
override fun showPrice() {
println("XYZPriceの金額は${price}円です。")
}
}
インラインクラスの委譲も可能
このインターフェースを実装したインラインクラスを作成する際、インターフェースの実装に委譲の仕組みを利用することができるように、バージョン1.7で変更されています。Kotlinには、プロパティ以外にクラスそのものに対しても委譲を適用できる仕組みがあります。その際も、プロパティ同様にbyキーワードを利用し、例えばリスト14のコードとなります。
@JvmInline value class BalalaikaPrice(val deligateCocktailPrice : CocktailPrice) : CocktailPrice by deligateCocktailPrice // (1) val xyzPrice = XYZPrice(1250) // (2) val balalaikaPrice = BalalaikaPrice(xyzPrice) // (3)
リスト14のポイントは、(1)でインラインクラスを定義する際、そのプロパティをCocktailPrice型としておき、そのプロパティをそのままbyの次に記述している点です。
このようなクラスを利用する場合(3)のコードになります。(2)で事前にリスト13のXYZPriceインスタンスを生成しておき、それをそのまま引数にBalalaikaPriceを生成します。すると、委譲の仕組みが働き、BalalaikaPriceの内容は、XYZPriceのインスタンスと同じになります。
まとめ
Kotlinのバージョン2.0までに導入された新機能をテーマごとに紹介する本連載の第4回は、いかがでしたでしょうか。今回は、クラスとインターフェースに関するアップデートというテーマの後編として、委譲プロパティとインラインクラスを紹介しました。さて、この連載も次回でいったんの区切りとなります。第5回はコルーチンを紹介します。
この記事は参考になりましたか?
既に会員の方はを行ってください。
- 【最新Kotlinアップデート解説】バージョン1.1からの変更点総まとめ連載記事一覧
-
- Kotlin最新アップデートまとめ ──非同期処理を実現する機能コルーチンを紹介
- Kotlin最新アップデートまとめ ──委譲プロパティやインラインクラスに関するアップデー...
- Kotlin最新アップデートまとめ ──sealedやdata、プロパティに関するアップデ...
- この記事の著者
-
WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
