Sobes.tech
Junior — Middle

Data class'da equals metodini qayta yozishda asosiy sinf maydonlarini hisobga olish kerakmi?

sobes.tech AI

AIdan javob

Kotlin'da, data class avtomatik ravishda equals, hashCode va toString metodlarini yaratadi, faqatgina sinfda e'lon qilingan xususiyatlarni hisobga oladi. Agar sizning sinfingiz asosiy sinfdan meros olgan bo'lsa va uning o'z maydonlari bo'lsa, odatda bu maydonlar taqqoslashda qatnashmaydi.

Agar taqqoslash mantiqasi asosiy sinf maydonlarini hisobga olishi kerak bo'lsa, equals metodini qo'lda qayta yozish tavsiya etiladi, super.equals(other) chaqirish va asosiy sinf maydonlarini tekshirish bilan. Aks holda, agar asosiy sinf taqqoslash uchun muhim bo'lmagan ma'lumotlarni o'z ichiga olmasa, avtomatik yaratilgan metodga ishonish mumkin.

Mana, asosiy sinfni hisobga olgan holda equals metodini qanday qayta yozish misoli:

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

Shu bilan, taqqoslash mantiqasi uchun muhim bo'lsa, asosiy sinf maydonlarini equals da hisobga olish tavsiya etiladi.