Sobes.tech
Middle

Zašto se prepisuju metode hashCode i operator poređenja ==?

sobes.tech АИ

Одговор од АИ

Prepisivanje hashCode i operatora == (za poređenje objekata po vrednosti, a ne po referenci) je neophodno za ispravno funkcionisanje kolekcija zasnovanih na heširanju, kao što su HashSet i HashMap.

  • Operator == : Određuje kada se dva objekta smatraju jednakim. Po podrazumevanom, poredi reference objekata. Prepisivanjem, implementiramo logiku poređenja po sadržaju ili atributima objekta.
  • Metod hashCode : Vraća celobrojnu vrednost (hash kod) za objekat. Ako su dva objekta jednaka prema ==, njihovi hashCode trebaju biti isti. Obrnuto nije nužno, (dva objekta mogu imati isti hashCode, ali biti različiti).

Nepostivanje ovog ugovora (jednaki objekti sa različitim hashCode) dovodi do neispravnog rada hash kolekcija: elementi mogu biti dodavani više puta tamo gde se očekuje jedinstvenost (HashSet), ili ne mogu biti pronađeni (HashMap).

Primer:

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  bool operator ==(Object other) {
    // Proverava da li je other Person
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    // Upoređuje atribute
    return other is Person && name == other.name && age == other.age;
  }

  @override
  int get hashCode => Object.hash(name, age); // Generiše hash od atributa
}

void main() {
  final p1 = Person('Alice', 30);
  final p2 = Person('Alice', 30);
  final p3 = Person('Bob', 25);

  print(p1 == p2); // true (poređenje po vrednosti nakon prepisivanja)
  print(p1 == p3); // false

  final peopleSet = {p1};
  print(peopleSet.contains(p2)); // true (pretraga po hash i poređenju)
}