Kotlinのデータクラスです。
はじめのまとめ
Kotlinに、値を表すクラスを作成する際に便利な機能のひとつとして、data class
があります。
data class
を用いると、そのclassにはコンパイラ側で以下の3つのメソッドが実装されます。
1. toString
2. equals
3. hashCode
実践
単純な例として、Person
クラスを見ていきましょう。
data class Person(val name: String, val age: Int)
データクラスを作成するには、予約語data
をクラスの前に付与します。
data class
を用いると、前述したように3つのメソッドがプライマリコンストラクタに渡される値(この例ではname
とage
)を適切に評価する形でオーバーライドされます。具体例を見てみましょう。
fun main(args: Array<String>) { val person1 = Person("taro", 20) val person2 = Person("taro", 20) val person3 = Person("hanako", 30) println(person1) println(person1 == person2) println(person2 == person3) println(person1.hashCode()) println(person2.hashCode()) println(person3.hashCode()) }
結果
Person(name=taro, age=20) true false 110131178 110131178 692713294
toString()
まずはじめにPersonオブジェクトを標準出力へ出力していますが、人から見てとても見やすい形に整形されているのがわかると思います。
equals()とhashCode()
さらに見ていきましょう。
Personオブジェクトを==
を用いて比較しています。
この場合、data class
ではプロパティの全ての値が一致しているかを判定してbool値を返します。Personクラスの例で言うと、nameとageが一致している場合ですね。
また、hashCode()
も同様に各プロパティにそった値を返すようになります。
なお、ひとつ注意点ですが、Kotlinの場合、Javaと異なりオブジェクトの同値性は==
で実施します。
一方、オブジェクトの同一性については===
での比較となります。
val person1 = Person("taro", 20) val person2 = Person("taro", 20) println(person1 == person2) //こちらはtrueだが、 println(person1 === person2) //こちらはfalse
上記のように、==
で比較した場合はnameとageの値が同じため、結果はtrue
となりますが、===
で比較すると同一のオブジェクトではないためfalse
を返していることがわかります。
終わりに
data class
を用いると従来Javaなどで実装していたequals
やtoString
といったメソッドを自動生成してくれるようになります。
単純な値を持つクラスを作る際には使っていくことにしましょう。