Junior — Middle
Vai ir jāņem vērā pamata klases lauki, pārveidojot equals metodi datu klasē?
sobes.tech AI
Atbilde no AI
Kotlinā data class automātiski ģenerē equals, hashCode un toString metodes, ņemot vērā tikai pašas klases deklarētās īpašības. Ja jūsu klase manto no bāzes klases ar saviem laukiem, šie lauki pēc noklusējuma netiek ņemti vērā salīdzinājumā.
Ja salīdzināšanas loģikai jāņem vērā bāzes klases lauki, ieteicams manuāli pārdefinēt equals metodi, izsaucot super.equals(other) un pievienojot bāzes klases lauku pārbaudi. Pretējā gadījumā, ja bāzes klase nesatur nozīmīgus datus salīdzinājumam, var paļauties uz ģenerēto metodi.
Piemērs, kā pārdefinēt equals, ņemot vērā bāzes klasi:
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()
}
Tādēļ, ja bāzes klases lauki ir svarīgi objektu salīdzināšanai, tos jāņem vērā equals metodē.