Sobes.tech
Junior — Middle

Pri prepisovaní metódy equals v dátovej triede je potrebné brať do úvahy polia základnej triedy?

sobes.tech AI

Odpoveď od AI

V Kotlin-e, data class automaticky generuje metódy equals, hashCode a toString, pričom uzima u obzir len vlastnosti deklarované v samotnej triede. Ak vaša trieda dedí od základnej triedy s vlastnými poľami, tieto polia sa štandardne nezapočítavajú do porovnania.

Ak logika porovnania má brať do úvahy polia základnej triedy, odporúča sa ručne prepísať metódu equals, volaním super.equals(other) a pridaním kontroly poľ základnej triedy. Inak, ak základná trieda neobsahuje relevantné dáta pre porovnanie, môžete sa spoľahnúť na generovanú metódu.

Príklad prepísania equals s ohľadom na základnú triedu:

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

Preto, ak sú polia základnej triedy dôležité pre logiku porovnania objektov, je potrebné ich zahrnúť do equals.