Sobes.tech
Junior — Middle

Faut-il prendre en compte les champs de la classe de base lors de la surcharge de la méthode equals dans une data class?

sobes.tech IA

Réponse de l'IA

En Kotlin, une data class génère automatiquement les méthodes equals, hashCode et toString, en tenant compte uniquement des propriétés déclarées dans la classe elle-même. Si votre classe hérite d'une classe de base avec ses propres champs, ces champs ne participent pas par défaut à la comparaison.

Si la logique de comparaison doit prendre en compte les champs de la classe de base, il est conseillé de redéfinir manuellement la méthode equals, en appelant super.equals(other) et en ajoutant la vérification des champs de la classe de base. Sinon, si la classe de base ne contient pas de données pertinentes pour la comparaison, on peut se fier à la méthode générée.

Exemple de redéfinition de equals en tenant compte de la classe de base :

open class Base(val id: Int) {
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is Base) return false
        return id == other.id
    }

    override fun hashCode() = id
}

data class Derived(val name: String) : Base(0) {
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is Derived) return false
        if (!super.equals(other)) return false
        return name == other.name
    }

    override fun hashCode() = super.hashCode() * 31 + name.hashCode()
}

Ainsi, prenez en compte les champs de la classe de base dans equals si ceux-ci sont importants pour la logique de comparaison des objets.