Ce face identical
Operatorul == întreabă „sunt egale?” și poate fi redefinit de fiecare clasă. identical(a, b) întreabă altceva: „sunt același obiect?”. Răspunsul este true doar dacă ambele variabile indică spre aceeași instanță din memorie.
Două liste cu aceleași elemente nu sunt identice dacă au fost create separat. Valorile const egale sunt însă create o singură dată și refolosite (canonizate), deci sunt identice. Numerele mici și textele literale pot fi și ele identice, dar nu te baza pe asta pentru texte construite în timpul rulării.
identityHashCode(obiect) returnează codul hash „de identitate” al obiectului, cel pe care l-ar da Object.hashCode dacă clasa nu l-ar suprascrie. Valoarea diferă de la o rulare la alta; folosește-o doar pentru comparații în același program, de exemplu în colecții care țin minte obiecte după identitate.
Parametri
| Parametru | Descriere |
|---|---|
a, b |
Cele două valori de comparat (pot fi null). |
object |
La identityHashCode: obiectul al cărui cod de identitate îl vrei. |
Ce returnează
identical: true dacă este același obiect. identityHashCode: un int.
Exemple
Exemplul 1: Egal nu înseamnă identic
Clasa Punct redefinește ==, deci două puncte cu aceleași coordonate sunt egale, dar sunt obiecte diferite.
class Punct {
final int x, y;
const Punct(this.x, this.y);
@override
bool operator ==(Object other) => other is Punct && other.x == x && other.y == y;
@override
int get hashCode => Object.hash(x, y);
}
void main() {
var a = Punct(1, 2);
var b = Punct(1, 2);
var c = a;
print(a == b);
print(identical(a, b));
print(identical(a, c));
const d = Punct(1, 2);
const e = Punct(1, 2);
print(identical(d, e));
}
Rezultat
true
false
true
true
Exemplul 2: Liste create separat
void main() {
var note1 = [9, 10];
var note2 = [9, 10];
print(identical(note1, note2));
print(identical(const [9, 10], const [9, 10]));
print(identical(null, null));
}
Rezultat
false
true
true
Exemplul 3: identityHashCode
Codul de identitate este același pentru același obiect, chiar dacă clasa își are propriul hashCode. Numerele exacte diferă la fiecare rulare, de aceea afișăm doar comparațiile.
class Elev {
final String nume;
Elev(this.nume);
@override
bool operator ==(Object other) => other is Elev && other.nume == nume;
@override
int get hashCode => nume.hashCode;
}
void main() {
var ana1 = Elev('Ana');
var ana2 = Elev('Ana');
print(ana1.hashCode == ana2.hashCode);
print(identityHashCode(ana1) == identityHashCode(ana1));
print(identityHashCode(ana1) == identityHashCode(ana2));
}
Rezultat
true
true
false
Greșeli frecvente
- Folosești
identicalpentru a compara texte sau numere citite de la utilizator. Pentru valori folosește==;identicaleste pentru obiecte. - Afișezi valoarea lui
identityHashCodeși te aștepți să fie aceeași la următoarea rulare. Nu este.
Comenzi înrudite
Object.hashCode: Un număr asociat obiectului, folosit de Set și Map; obiectele egale cu == trebuie să aibă același hashCode.Object.hash: Combină codurile hash ale mai multor valori într-unul singur; hashAll face același lucru pentru o colecție.Object: Clasa de bază a tuturor claselor Dart, cu excepția lui Null; runtimeType dă tipul real al unui obiect.