Sobes.tech
Junior — Middle

Vai ir jāņem vērā pamata klases lauki, pārveidojot equals metodi datu klasē?

sobes.tech AI

Atbilde no AI

Kotlinā data class automātiski ģenerē equals, hashCode un toString metodes, ņemot vērā tikai pašas klases deklarētās īpašības. Ja jūsu klase manto no bāzes klases ar saviem laukiem, šie lauki pēc noklusējuma netiek ņemti vērā salīdzinājumā.

Ja salīdzināšanas loģikai jāņem vērā bāzes klases lauki, ieteicams manuāli pārdefinēt equals metodi, izsaucot super.equals(other) un pievienojot bāzes klases lauku pārbaudi. Pretējā gadījumā, ja bāzes klase nesatur nozīmīgus datus salīdzinājumam, var paļauties uz ģenerēto metodi.

Piemērs, kā pārdefinēt equals, ņemot vērā bāzes klasi:

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

Tādēļ, ja bāzes klases lauki ir svarīgi objektu salīdzināšanai, tos jāņem vērā equals metodē.