Junior — Middle
Czy należy uwzględniać pola klasy bazowej podczas nadpisywania metody equals w klasie danych?
sobes.tech AI
Odpowiedź od AI
W Kotlinie, data class automatycznie generuje metody equals, hashCode i toString, uwzględniając tylko właściwości zadeklarowane w samej klasie. Jeśli Twoja klasa dziedziczy po klasie bazowej z własnymi polami, domyślnie te pola nie biorą udziału w porównaniu.
Jeśli logika porównania powinna uwzględniać pola klasy bazowej, warto ręcznie nadpisać metodę equals, wywołując super.equals(other) i dodając sprawdzenie pól klasy bazowej. W przeciwnym razie, jeśli klasa bazowa nie zawiera danych istotnych dla porównania, można polegać na wygenerowanej metodzie.
Przykład nadpisania equals z uwzględnieniem klasy bazowej:
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()
}
Zatem, uwzględniaj pola klasy bazowej w equals, jeśli są istotne dla logiki porównania obiektów.