Érdemes figyelembe venni az alap osztály mezőit az equals metódus felülírásakor egy adat osztályban?
sobes.tech MI
Válasz az MI-től
Kotlinben egy data class automatikusan generálja az equals, hashCode és toString metódusokat, kizárólag a saját osztályban deklarált tulajdonságokat figyelembe véve. Ha az osztályod egy ősosztályból örököl saját mezőkkel, ezek az alapértelmezett összehasonlításban nem vesznek részt.
Ha az összehasonlítási logikának figyelembe kell vennie az ősosztály mezőit, akkor érdemes manuálisan felülírni az equals metódust, meghívva a super.equals(other)-t és hozzáadva az ősosztály mezőinek ellenőrzését. Ellenkező esetben, ha az ősosztály nem tartalmaz releváns adatokat az összehasonlításhoz, bízhatsz a generált módszerben.
Példa az equals felülírására az ősosztály figyelembevételével:
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()
}
Ezért, ha az ősosztály mezői fontosak az objektumok összehasonlásához, akkor azokat az equals-ben figyelembe kell venni.