Трябва ли да се вземат предвид полетата на базовия клас при преписването на метода 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()
}
Затова, вземете предвид полетата на базовия клас в equals, ако те са важни за логиката на сравнение на обектите.