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 αν είναι σημαντικά για τη λογική σύγκρισης των αντικειμένων.