SHOEISHA iD

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

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

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

Kotlin最新アップデートまとめ ──sealedやdata、プロパティに関するアップデート

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

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

dataに関する変更点

 次に紹介するのは、dataに関する変更点です。

dataクラスとは

 dataクラスはKotlinの特徴的なクラスで、例えばリスト6のようなクラス宣言です。

[リスト6]dataクラスの例
data class PersonalData(  // (1)
  val name: String,  // (2)
  val email: String  // (2)
)

 リスト6の(1)のように、クラス宣言にdataキーワードを利用します。そして、プライマリコンストラクタの引数として(2)のようにプロパティを定義します。(2)ではval宣言としていますが、もちろんvarも利用できます。

 このように、プロパティ以外は定義していないクラスですが、dataクラスとして作成された時点で、表1のメソッドが自動生成されています。

表1:dataクラスで自動生成されるメソッド
メソッド名 内容
equals() 保持しているデータ内容が同じかどうかを判定するメソッド
hashCode() 保持しているデータを元にしたハッシュコードを取得するメソッド
toString() 保持しているデータの表示に適した文字列を生成してくれるメソッド
componentN() 各プロパティの値を取得できるメソッド
copy() 同じデータを持つ別のインスタンスを生成するメソッド

 例えば、リスト6のPersonalDataを利用してリスト7のようなコードを実行したとします。

[リスト7]PersonalDataクラスを利用した例
val taro = PersonalData("田中太郎", "taro@tanaka.com")
println(taro)

 すると、「PersonalData(name=田中太郎, email=taro@tanaka.com)」のように表示されます。単なるクラスのインスタンスをそのまま表示させた場合は「PersonalData@3af49f1c」という表記になるので、比べるとtoString()が表示に最適化されているのがわかります。

 なお、通常のクラス同様に、任意のメソッドを追加で定義することもできます。

スーパークラスを持てるように変更

 このdataクラスに関して、バージョン1.1で任意のクラスを継承できるように変更されています。例えば、リスト8のような抽象クラスPersonalBaseがあるとします。

[リスト8]抽象クラスPersonalBase
abstract class PersonalBase {
  abstract fun show()
}

 リスト8のPersonalDataを、このPersonalBaseクラスを継承したdataクラスとした場合、PersonalBaseクラスに定義されている抽象メソッドshow()をオーバーライドして、リスト9のように作成します。

[リスト9]抽象クラスPersonalBaseを継承したdataクラスの例
data class PersonalData(
  :
) : PersonalBase() {
  override fun show() {
    println("${name}のメールアドレスは${email}です。")
  }
}

 show()メソッドが定義されていますが、dataクラスなので表1のメソッドも自動的に生成されています。

dataオブジェクトが利用可能に

 いくつかのメソッドが自動生成されたdataクラスをもっと手軽に利用できるように、バージョン1.9でdataオブジェクトが導入されました。

 これは、例えばリスト10の(1)のようなコードです。単にobject宣言にdataをつけるだけです。

[リスト10]dataオブジェクトの例
data object Yamamoto {  // (1)
  val name = "山本三郎"  // (1)
}  // (1)
println(Yamamoto)  // (2)

 すると自動的にtoString()メソッドが生成され、(2)の実行結果として「Yamamoto@31befd9f」のような表示にはならず、「Yamamoto」のようにオブジェクト名が表示されるようになります。

 ただし、componentN()とcopy()メソッドは自動生成されていないので注意してください。

dataとsealedの組み合わせ

 dataクラスは、sealedクラスやsealedインターフェースの継承構造の中に組み込むことができます。例えば、リスト11のようなsealedクラスCocktailがあるとします(リスト3のインターフェースとは別物です)。

[リスト11]sealedクラスであるCocktail
sealed class Cocktail {
  abstract fun show()
}

 このクラスを継承したdataクラスとしてGinBaseCocktailを定義するとしたら、リスト12のようなコードとなります(こちらも、リスト4のGinBaseCocktailとは別物です)。

[リスト12]sealedクラスを継承したdataクラスであるGinBaseCocktail
data class GinBaseCocktail(
  val name: String,
  val ginVolume: Int
) : Cocktail() {
  override fun show() {
    println("${name}のジンの量は${ginVolume}")
  }
}

 このクラスはsealedクラスを継承したクラスなので、この段階では、CocktailクラスのサブクラスはGinBaseCocktailのみであることが保証されます。

 さらにdataクラスでもあるので、例えばリスト13のコードを実行した場合、その実行結果は「GinBaseCocktail(name=ホワイトレディ, ginVolume=30)」となります。

[リスト13]GinBaseCocktailを利用した実行コード
val whiteLady = GinBaseCocktail("ホワイトレディ", 30)
println(whiteLady)

 さらに、リスト14のdataオブジェクトを作成し、そのオブジェクトのtoString()の値を表示したとしても、「NewYork」とオブジェクト名が表示されるようになります。

[リスト14]sealedクラスを継承したdataオブジェクトの例
data object NewYork : Cocktail() {
  val name = "ニューヨーク"
  override fun show() {
    println("${name}です")
  }
}

 なお、先述のsealedの制約の通り、リスト11のCocktail、リスト12のGinBaseCocktail、および、リスト14のNewYorkは、同一パッケージ内で宣言されている必要があります。

次のページ
プロパティに関する変更点

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

  • 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/21732 2025/06/24 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング