Sobes.tech
Junior — Middle

Měli bychom při přepisování metody equals v datové třídě brát v úvahu pole základní třídy?

sobes.tech AI

Odpověď od AI

V Kotlinu automaticky generuje data class metody equals, hashCode a toString, přičemž zohledňuje pouze vlastnosti deklarované ve třídě samotné. Pokud vaše třída dědí od základní třídy s vlastními poli, tyto pole se ve výchozím nastavení nezapočítávají do porovnání.

Pokud logika porovnání má brát v úvahu pole základní třídy, je vhodné přepsat metodu equals ručně, voláním super.equals(other) a přidáním kontroly polí základní třídy. Jinak, pokud základní třída neobsahuje data relevantní pro porovnání, můžete se spolehnout na vygenerovanou metodu.

Příklad přepsání equals s ohledem na základní třídu:

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

Protože, pokud jsou pole základní třídy důležitá pro logiku porovnání objektů, je třeba je zahrnout do equals.