SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

【最新Kotlinアップデート解説】バージョン1.1からの変更点総まとめ

Kotlin最新アップデートまとめ ──委譲プロパティやインラインクラスに関するアップデート

【最新Kotlinアップデート解説】バージョン1.1からの変更点総まとめ 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

インラインクラスの導入

 クラスやインターフェースに関する変更点の最後に紹介するのは、インラインクラスです。

インラインクラスとは

 インラインクラスは、バージョン1.5で新たに導入された仕組みであり、英語での正式名称は、Inline Value Classesとvalueが入ります。そのため、第2回で紹介したインライン関数や前回紹介したインラインプロパティとは、少し仕組みが違います。

 とはいえ、何かが埋め込まれるために「インライン」という名称が使われており、その埋め込まれるものが値=valueであることから、先の英語の名称となっています。

 インラインクラスは、ただひとつの読み取り専用の値を保持するためだけのクラスです。そのため、保持している値に対して別名をつけるようなイメージであり、そのような場合に有効です。

 このような仕組みから、クラス構文は、例えばリスト10のようになります。このクラスは、ホワイトレディカクテルの金額のみを保持するためのクラスです。そして、その金額=Int型の値にWhiteLadyPriceという名称を与え、以降は、WhiteLadyPrice型として扱われるようになります。

[リスト10]インラインクラスの例
@JvmInline  // (1)
value class WhiteLadyPrice(val price: Int)  // (2)

 インラインクラスの特徴としては、リスト10の(2)のように、クラス宣言にvalueキーワードを付与します。そして、ただひとつの読み取り専用の値を保持するために、valプロパティをひとつだけ宣言し、コンストラクタの引数とします。このことから、インスタンス生成時にその値を受け取り、それを読み取り専用として保持するクラスとなります。

 なお、このインラインクラスをJVM上で利用する場合は(1)の@JvmInlineアノテーションが必要となります。といっても、ほとんどのKotlinコードはJVMでの動作を前提としているので、実質このアノテーションは必須と言えます。

インラインクラスに記述できるもの

 インラインクラスは、ある値に対して別名とその名称のデータ型を付与するような仕組みであり、型エイリアスのように思えるかもしれません。

 しかし、インラインクラスには、valプロパティ以外に以下のメンバが定義でき、これが型エイリアスではなしえないインラインクラスの特徴です。

  1. initブロック
  2. セカンダリコンストラクタ
  3. 算出プロパティ
  4. 通常メソッド

 これらをWhiteLadyPriceに追記したサンプルコードは、リスト11のようになります。

[リスト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があるとします。

[リスト12]CocktailPriceインターフェース
interface CocktailPrice {
  fun showPrice()
}

 このCocktailPriceインターフェースを実装したインラインクラスは、リスト13のようにshowPrice()をオーバーライドする必要があります。

[リスト13]CocktailPriceインターフェースを実装したインラインクラスの例
@JvmInline
value class XYZPrice(val price: Int) : CocktailPrice {
  override fun showPrice() {
    println("XYZPriceの金額は${price}円です。")
  }
}

インラインクラスの委譲も可能

 このインターフェースを実装したインラインクラスを作成する際、インターフェースの実装に委譲の仕組みを利用することができるように、バージョン1.7で変更されています。Kotlinには、プロパティ以外にクラスそのものに対しても委譲を適用できる仕組みがあります。その際も、プロパティ同様にbyキーワードを利用し、例えばリスト14のコードとなります。

[リスト14]CocktailPriceインターフェースの実装に委譲を利用した例
@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回はコルーチンを紹介します。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
【最新Kotlinアップデート解説】バージョン1.1からの変更点総まとめ連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/22092 2025/08/25 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング