Ce face Any.toString
Orice clasă din Kotlin moștenește din Any trei funcții: toString(), hashCode() și equals(). toString() returnează textul obiectului și este apelată automat de println și de string templates. Implicit dă ceva de forma Produs@1b6d3586 (numele clasei și un număr), așa că o suprascrii cu override fun toString().
hashCode() returnează un număr întreg calculat din conținutul obiectului. HashMap și HashSet îl folosesc pentru a găsi repede elementele. Regula: două obiecte egale după equals trebuie să aibă același hashCode. Dacă suprascrii una dintre ele, suprascrie-le pe amândouă.
Clasele data primesc automat toString, equals și hashCode după proprietățile din constructor, așa că de obicei nu le mai scrii de mână.
Ce returnează
toString: un String. hashCode: un Int.
Exemple
Exemplul 1: Suprascrierea lui toString
println și template-ul folosesc automat textul dat de toString. Clasa data are deja o variantă generată.
class Produs(val nume: String, val pret: Double) {
override fun toString() = "$nume – $pret lei"
}
data class Oras(val nume: String, val judet: String)
fun main() {
val p = Produs("cafea", 24.5)
println(p)
println("În coș: $p")
println(p.toString().length)
println(Oras("Iași", "IS"))
println(42.toString() + "!")
}
Rezultat
cafea – 24.5 lei
În coș: cafea – 24.5 lei
16
Oras(nume=Iași, judet=IS)
42!
Exemplul 2: hashCode la obiecte egale
Două obiecte data cu aceleași valori sunt egale și au același hashCode, deci HashSet le păstrează o singură dată. Pentru texte, hashCode este același la fiecare rulare.
data class Student(val nume: String, val grupa: Int)
fun main() {
val a = Student("Ana", 101)
val b = Student("Ana", 101)
println(a == b)
println(a.hashCode() == b.hashCode())
println(hashSetOf(a, b, Student("Ion", 102)).size)
println("Ana".hashCode())
}
Rezultat
true
true
2
65972
Greșeli frecvente
- Suprascrii
equalsîntr-o clasă obișnuită, dar nu șihashCode. Obiectele egale ajung de două ori într-un HashSet. Suprascrie-le împreună sau foloseștedata class. - Te bazezi pe hashCode ca identificator unic. Două obiecte diferite pot avea același hashCode.
- Afișezi un obiect obișnuit și primești
Produs@1b6d3586. Adaugăoverride fun toString().
Comenzi înrudite
println: Afișează o valoare pe ecran: println trece apoi la rând nou, print rămâne pe același rând.Comparable.compareTo: compareTo compară două obiecte și dă un număr negativ, 0 sau pozitiv; compareValues face la fel și acceptă null.