Sobes.tech
Junior — Middle

Պետք է հաշվի առնել հիմնական դասի դաշտերը, երբ վերաշարադրում եք equals մեթոդը data class-ում?

sobes.tech AI

Պատասխան AI-ից

Kotlin-ում, data class ավտոմատ կերպով ստեղծում է equals, hashCode և toString մեթոդները, հաշվի առնելով միայն այն հատկությունները, որոնք հայտարարված են հենց դասում։ Եթե ձեր դասը ժառանգում է բազային դասից և ունի սեփական դաշտեր, ապա այդ դաշտերը ըստ նախնական կարգի չեն մասնակցում համեմատությանը։

Եթե համեմատության տրամաբանությունը պետք է հաշվի առնի բազային դասի դաշտերը, խորհուրդ է տրվում ձեռքով վերագրել equals մեթոդը, կանչելով super.equals(other) և ավելացնելով բազային դասի դաշտերի ստուգում։ Այլապես, եթե բազային դասը պարունակում է ոչ կարևոր տվյալներ համեմատության համար, կարող եք վստահել ավտոմատորեն ստեղծված մեթոդին։

Նմուշ՝ equals վերագրում բազային դասի հաշվի առմամբ.

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

Այսպիսով, հաշվի առեք բազային դասի դաշտերը, եթե դրանք կարևոր են օբյեկտների համեմատության տրամաբանության համար։