Պետք է հաշվի առնել հիմնական դասի դաշտերը, երբ վերաշարադրում եք 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()
}
Այսպիսով, հաշվի առեք բազային դասի դաշտերը, եթե դրանք կարևոր են օբյեկտների համեմատության տրամաբանության համար։