Sobes.tech
Junior — Middle

Data class-ში equals მეთოდის გადახედვისას აუცილებელია ძირითადი კლასის ველები გაითვალისწინოთ?

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-ში უნდა გაითვალისწინოთ.