identical în Dart

Verifică dacă două variabile arată spre exact același obiect din memorie, nu doar spre obiecte egale.

Sintaxă
bool identical(Object? a, Object? b)
int identityHashCode(Object? object)

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 identical pentru a compara texte sau numere citite de la utilizator. Pentru valori folosește ==; identical este 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.