kotlinのdataclass(データクラス)とは?dataclassの実践的な使用方法
Kotlinのdata classとは、データを保持する役割のクラスに使う記法のことです。
データにアクセスするための関数・比較のための関数を自動で生成する、クラスを発展させた物です。
そんなdata classについて本記事では解説していくので一緒に学んでいきましょう。
目次
1.data classとは
Kotlinでは、データを扱うための便利な機能として、data class(データクラス)が用意されています。
2.Kotlinにおけるdata classのサンプル
data classを使うには、クラス名の前にdataキーワードを付けます。また、プライマリコンストラクタに少なくとも1つ以上のプロパティを宣言する必要があります。例えば、以下のようにPersonクラスを定義できます。
data class Person(val name: String, var age: Int) val taro = Person("Taro", 20) val jiro = Person("Jiro", 25) // equals()やtoString()メソッドを使った例 println(taro == jiro) // false println(taro.toString()) // Person(name=Taro, age=20) // 分割代入 val (name, age) = taro println(name) // Taro println(age) // 20 // コピーを作成 val jugemu = taro.copy(name = "Jugemu") println(jugemu) // Person(name=Jugemu, age=20)
2-1.data classの宣言方法
data classを宣言する際には、以下のルールに従う必要があります。
- クラス名の前にdataキーワードを付ける
- プライマリコンストラクタに少なくとも1つ以上のプロパティを宣言する
- プロパティはval(読み取り専用)かvar(読み書き可能)であること
- プロパティはカスタムアクセサーを持たないこと
- プロパティはopen、override、abstract、lateinitなどの修飾子を持たないこと
2-2.copyメソッドの使い方
data class Person(val name: String, val age: Int, val address: String) val taro = Person("Taro", 20, "Tokyo") val jiro = taro.copy(name = "Jiro") // Taroと同じ年齢と住所で、名前だけJiroにしたオブジェクトを作る println(taro) // Person(name=Taro, age=20, address=Tokyo) println(jiro) // Person(name=Jiro, age=20, address=Tokyo)
copyメソッドは、プライマリコンストラクタで宣言されたプロパティに対応する引数を持ちます。引数を指定しない場合は、元のオブジェクトと同じ値が使われます。引数を指定する場合は、その値でプロパティが上書きされます。
copyメソッドは、データクラスのオブジェクトを不変に扱いたい場合や、一部の値だけ変えたい場合に便利です。
2-3.equalsメソッドの注意点
equalsメソッドは、オブジェクト同士の等価性を判定するためのメソッドです。Kotlinでは、オブジェクトに対して==や!=を適用すると、内部的にequalsメソッドの呼び出しに変換されます。しかしプロパティに配列が使われている場合は内部の要素が一致していてもオブジェクトとして見ると一致していないため、falseが返ってきます。そのためIDEでのequalsメソッドの生成処理等を使用して、正しいequalsメソッドをオーバーライドするようにしてください。その際hashCodeメソッドもオーバーライドすることを忘れないようにしましょう。
2-4.interfaceの実装方法
データクラスは、インターフェースを実装することができます。
インターフェースを実装する場合は、インターフェースで定義されたメソッドやプロパティをデータクラスでオーバーライドして、実装する必要があります。例えば、以下のようなインターフェースがあるとします。
interface Printable { fun print() } // このインターフェースを実装するデータクラスは以下のようになります。 data class User(val name: String, val age: Int) : Printable { override fun print() { println("User(name=$name, age=$age)") } }
2-5.分解宣言
データクラスは、分解宣言という機能をサポートしています。分解宣言とは、データクラスのオブジェクトを、プライマリコンストラクタで宣言されたプロパティの値に分解して、別々の変数に代入することです。分解宣言をするには、以下のように書きます。
val user = User("Taro", 20) val (name, age) = user println(name) // Taro println(age) // 20
3.その他標準のデータクラス
Kotlinでは、標準ライブラリでいくつかのデータクラスが提供されています。これらのデータクラスは、一般的な用途に便利なものです。ここでは、PairとTripleという2つのデータクラスについて紹介します。
3-1.Pair
Pairは、2つの値を保持するためのデータクラスです。Pairは以下のように定義されています。
data class Pair( val first: A, val second: B ) : Serializable //Pairオブジェクトを作るには以下のように書くことができます。 val pair = Pair("Taro", 20) println(pair.first) // Taro println(pair.second) // 20
3-2.Tripl
Tripleは、3つの値を保持するためのデータクラスです。Tripleは以下のように定義されています。
data class Triple( val first: A, val second: B, val third: C ) : Serializable val triple = Triple("Taro", 20, "Tokyo") println(triple.first) // Taro println(triple.second) // 20 println(triple.third) // Tokyo
4.まとめ
この章では、Kotlinのデータクラスについて学びました。データクラスは、データを保持するためのクラスであり、equalsメソッドやhashCodeメソッドなどを自動的に生成してくれます。
データクラスはインターフェースを実装したり、分解宣言をサポートしたりすることもできます。
また、標準ライブラリで提供されているPairとTripleという2つのデータクラスについて紹介しました。これらのデータクラスは、2つや3つの値を関連付けて返したいときに便利です。
データクラスは、Kotlinの便利な機能の一つです。データを扱うときには、ぜひ活用してみてください。
コメント