web-dev-qa-db-ja.com

KotlinのデータクラスのEqualsメソッド

私は次のデータクラスを持っています

data class PuzzleBoard(val board: IntArray) {
    val dimension by lazy { Math.sqrt(board.size.toDouble()).toInt() }
}

Kotlinのデータクラスがequals()/ hashcode()メソッドを無料で取得することを読みました。

2つのオブジェクトをインスタンス化しました。

val board1 = PuzzleBoard(intArrayOf(1,2,3,4,5,6,7,8,0))
val board2 = PuzzleBoard(intArrayOf(1,2,3,4,5,6,7,8,0))

それでも、次のステートメントはfalseを返します。

board1 == board2
board1.equals(board2)
41
Vaibhav

Kotlinの Data classes の場合、hashcode()メソッドは、両方のオブジェクトのパラメーター値が同じ場合、同じ整数を生成して返します。

val user = User("Alex", 1)
val secondUser = User("Alex", 1)
val thirdUser = User("Max", 2)

println(user.hashCode().equals(secondUser.hashCode()))
println(user.hashCode().equals(thirdUser.hashCode()))

このコードを実行すると、TrueおよびFalseが作成されたときのようにsecondUserオブジェクトobjectuserと同じ引数を渡したため、hashCode()integer両方に対して生成されるものは同じです。

これを確認する場合も:

println(user.equals(thirdUser))

Falseを返します。

HashCode()メソッドドキュメントに従って

open fun hashCode(): Int (source)

オブジェクトのハッシュコード値を返します。 hashCodeの一般的な契約は次のとおりです。

同じオブジェクトで2回以上呼び出されるときは常に、hashCodeメソッドは同じ整数を返す必要があります。ただし、オブジェクトの等価比較で使用される情報が変更されない場合に限ります。

Equals()メソッドに従って2つのオブジェクトが等しい場合、2つのオブジェクトのそれぞれでhashCodeメソッドを呼び出すと、同じ整数の結果が生成される必要があります。

詳細については、この説明を参照してください here

2
TapanHP