data class

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つのメソッドがプライマリコンストラクタに渡される値(この例ではnameage)を適切に評価する形でオーバーライドされます。具体例を見てみましょう。

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などで実装していたequalstoStringといったメソッドを自動生成してくれるようになります。 単純な値を持つクラスを作る際には使っていくことにしましょう。