web-dev-qa-db-fra.com

Méthode Equals pour la classe de données en kotlin

J'ai la classe de données suivante

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

J'ai lu que les classes de données dans Kotlin obtenaient la méthode equals ()/hashcode () gratuitement.

J'ai instancié deux objets.

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))

Mais toujours les déclarations suivantes retournent faux.

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

Pour classes de données dans Kotlin, la méthode hashcode () générera et renverra le même entier si les valeurs des paramètres sont identiques pour les deux objets.

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()))

L'exécution de ce code retournera True et False comme lorsque nous avons créé secondUser objet, nous avons passé le même argument que object utilisateur , donc hashCode () entier généré pour les deux sera le même.

aussi si vous voulez vérifier ceci:

println(user.equals(thirdUser))

Cela retournera faux.

Selon la méthode hashCode ()

open fun hashCode(): Int (source)

Retourne une valeur de code de hachage pour l'objet. Le contrat général de hashCode est:

Chaque fois qu'elle est appelée plusieurs fois sur le même objet, la méthode hashCode doit systématiquement renvoyer le même entier, à condition qu'aucune information utilisée dans les comparaisons égales de l'objet ne soit modifiée.

Si deux objets sont égaux selon la méthode equals (), l'appel de la méthode hashCode sur chacun des deux objets doit produire le même résultat entier.

Pour plus de détails, voir cette discussion ici

2
TapanHP