Set.identity în Dart

Set: mulțimi Dart 2.0

Set care compară elementele după identitate (același obiect în memorie), nu după operatorul ==.

Sintaxă
factory Set<E>.identity()

Ce face Set.identity

Un set obișnuit consideră egale două obiecte dacă == spune asta. Set.identity() folosește în schimb identical: două obiecte diferite rămân două elemente chiar dacă au aceleași date.

Este util când vrei să ții evidența obiectelor deja procesate (de exemplu la parcurgerea unui graf), indiferent cum este definită egalitatea lor.

Ce returnează

Un set gol, care păstrează ordinea inserării și compară cu identical.

Exemple

Exemplul 1: Egalitate față de identitate

class Punct {
  final int x, y;
  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() {
  final a = Punct(1, 2);
  final b = Punct(1, 2);

  final normal = {a, b};
  final dupaIdentitate = Set<Punct>.identity()..addAll([a, b, a]);
  print('set obișnuit: ${normal.length} element');
  print('Set.identity: ${dupaIdentitate.length} elemente');
}

Rezultat

set obișnuit: 1 element
Set.identity: 2 elemente

Exemplul 2: Obiecte deja vizitate

class Nod {
  final String nume;
  final List<Nod> vecini = [];
  Nod(this.nume);
}

void main() {
  final iasi = Nod('Iași');
  final vaslui = Nod('Vaslui');
  final bacau = Nod('Bacău');
  iasi.vecini.addAll([vaslui, bacau]);
  vaslui.vecini.addAll([iasi, bacau]);
  bacau.vecini.addAll([iasi, vaslui]);

  final vizitate = Set<Nod>.identity();
  void viziteaza(Nod n) {
    if (!vizitate.add(n)) return;
    print('Vizitez ${n.nume}');
    n.vecini.forEach(viziteaza);
  }

  viziteaza(iasi);
}

Rezultat

Vizitez Iași
Vizitez Vaslui
Vizitez Bacău

Greșeli frecvente

  • Pui texte sau numere într-un Set.identity() și te aștepți la comportamentul obișnuit. Pentru ele, identitatea poate fi diferită de egalitate; folosește un set normal.

Comenzi înrudite

  • Set: Colecție fără elemente duplicate: fiecare valoare apare o singură dată, iar căutarea este rapidă.
  • identical: Verifică dacă două variabile arată spre exact același obiect din memorie, nu doar spre obiecte egale.
  • LinkedHashSet: Set care păstrează ordinea inserării; este tipul implicit al seturilor scrise cu acolade.
  • Set.lookup: Returnează elementul din set egal cu valoarea dată (obiectul păstrat în set), sau null dacă nu există.