Sobes.tech
Junior — Middle

Czy należy uwzględniać pola klasy bazowej podczas nadpisywania metody equals w klasie danych?

sobes.tech AI

Odpowiedź od AI

W Kotlinie, data class automatycznie generuje metody equals, hashCode i toString, uwzględniając tylko właściwości zadeklarowane w samej klasie. Jeśli Twoja klasa dziedziczy po klasie bazowej z własnymi polami, domyślnie te pola nie biorą udziału w porównaniu.

Jeśli logika porównania powinna uwzględniać pola klasy bazowej, warto ręcznie nadpisać metodę equals, wywołując super.equals(other) i dodając sprawdzenie pól klasy bazowej. W przeciwnym razie, jeśli klasa bazowa nie zawiera danych istotnych dla porównania, można polegać na wygenerowanej metodzie.

Przykład nadpisania equals z uwzględnieniem klasy bazowej:

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()
}

Zatem, uwzględniaj pola klasy bazowej w equals, jeśli są istotne dla logiki porównania obiektów.