Moeten de velden van de basisklasse worden meegenomen bij het overschrijven van de equals-methode in een data class?
sobes.tech AI
Antwoord van AI
In Kotlin genereert een data class automatisch de methoden equals, hashCode en toString, waarbij alleen de eigenschappen die in de klasse zelf zijn gedeclareerd worden meegenomen. Als jouw klasse erft van een basisklasse met eigen velden, worden deze velden standaard niet meegenomen in de vergelijking.
Als de vergelijkingslogica rekening moet houden met de velden van de basisklasse, is het aan te raden om de equals-methode handmatig te overschrijven, door super.equals(other) aan te roepen en de velden van de basisklasse te controleren. Anders, als de basisklasse geen relevante gegevens bevat voor de vergelijking, kun je vertrouwen op de gegenereerde methode.
Voorbeeld van het overschrijven van equals met inachtneming van de basisklasse:
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()
}
Houd er rekening mee dat je de velden van de basisklasse in equals moet meenemen als ze belangrijk zijn voor de objectvergelijking.