Ar turėtume atsižvelgti į pagrindinio klases laukus keičiant equals metodą duomenų klasėje?
sobes.tech AI
Atsakymas iš AI
Kotlin'e, data class automatiškai generuoja equals, hashCode ir toString metodus, atsižvelgiant tik į pačios klasės deklaruotas savybes. Jei jūsų klasė paveldi iš bazinės klasės su savo laukais, šie laukeliai pagal numatytuosius nustatymus nedalyvauja palyginime.
Jei palyginimo logika turi atsižvelgti į bazinės klasės laukus, rekomenduojama rankiniu būdu perrašyti equals metodą, iškviečiant super.equals(other) ir pridėti bazinės klasės laukų patikrinimą. Kitaip, jei bazinė klasė neapima reikšmingų duomenų palyginimui, galite pasikliauti sugeneruotu metodu.
Pavyzdys, kaip perrašyti equals, atsižvelgiant į bazinę klasę:
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()
}
Taigi, jei bazinės klasės laukai yra svarbūs objektų palyginimui, juos reikia įtraukti į equals metodą.