Sobes.tech
Junior — Middle

Da li treba uzeti u obzir polja osnovne klase prilikom prepisivanja metode equals u data class?

sobes.tech АИ

Одговор од АИ

U Kotlin-u, data class automatski generiše metode equals, hashCode i toString, uzimajući u obzir samo svojstva deklarisana u samoj klasi. Ako vaša klasa nasleđuje od osnovne klase sa sopstvenim poljima, ta polja po default-u nisu uključena u poređenje.

Ako logika poređenja treba da uzme u obzir polja osnovne klase, preporučljivo je ručno prepisati metodu equals, pozivajući super.equals(other) i dodajući proveru polja osnovne klase. U suprotnom, ako osnovna klasa ne sadrži relevantne podatke za poređenje, možete se osloniti na generisanu metodu.

Primer prepisivanja equals sa uzimanjem u obzir osnovne klase:

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

Dakle, uzimajte u obzir polja osnovne klase u equals ako su važna za logiku poređenja objekata.