Sobes.tech
Junior — Middle

Data class-da equals metodunu yeniləyərkən əsas sinifin sahələrini nəzərə almaq lazımdırmı?

sobes.tech Süni İntellekt

AI-dan cavab

Kotlin-də, data class avtomatik olaraq equals, hashCodetoString metodlarını yaradır, yalnızca sinifdə elan olunan xüsusiyyətləri nəzərə alaraq. Əgər sinfiniz əsas sinifdən miras alıb və onun öz sahələri varsa, bu sahələr standart olaraq müqayisədə iştirak etmir.

Əgər müqayisə məntiqi əsas sinifin sahələrini nəzərə almalıdırsa, equals metodunu əl ilə yenidən yazmaq və super.equals(other) çağırmaq və əsas sinifin sahələrini yoxlamaq tövsiyə olunur. Əks halda, əgər əsas sinif müqayisə üçün əhəmiyyətli məlumatlar içermirsə, avtomatik yaradılmış metoda güvənə bilərsiniz.

Əsas sinfi nəzərə alaraq equals metodunun necə yenidən yazılacağına nümunə:

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

Yəni, obyektlərin müqayisə məntiqində əsas sinfin sahələri vacibdirsə, equals daxilində nəzərə alın.