Sobes.tech
Junior — Middle

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