Trebuie luate în considerare câmpurile clasei de bază atunci când se suprascrie metoda equals într-o clasă de date?
sobes.tech AI
Răspuns de la AI
În Kotlin, o data class generează automat metodele equals, hashCode și toString, luând în considerare doar proprietățile declarate în clasa în sine. Dacă clasa ta moștenește de la o clasă de bază cu propriile câmpuri, aceste câmpuri, în mod implicit, nu participă la comparație.
Dacă logica de comparație trebuie să țină cont de câmpurile clasei de bază, este recomandat să suprascrii manual metoda equals, apelând super.equals(other) și adăugând verificarea câmpurilor clasei de bază. În caz contrar, dacă clasa de bază nu conține date relevante pentru comparație, poți să te bazezi pe metoda generată.
Exemplu de suprascriere a equals ținând cont de clasa de bază:
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()
}
Prin urmare, luați în considerare câmpurile clasei de bază în equals dacă acestea sunt importante pentru logica de comparație a obiectelor.