С помощью каких методов обеспечивается уникальность элементов в Set в Dart?

«С помощью каких методов обеспечивается уникальность элементов в Set в Dart?» — вопрос из категории Dart Core, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Dart уникальность элементов в Set обеспечивается через корректную реализацию методов hashCode и оператора == (operator ==). Set использует хэш-таблицу, и для сравнения объектов сначала проверяет их хэш-коды, а затем, если хэш-коды совпали, вызывает == для точного сравнения.

Пример для кастомного класса:

class User {
  final String id;
  final String email;

  User(this.id, this.email);

  // Критически важно переопределить оба метода
  @override
  bool operator ==(Object other) {
    return identical(this, other) ||
        other is User &&
            runtimeType == other.runtimeType &&
            id == other.id; // Уникальность по ID
  }

  @override
  int get hashCode => id.hashCode; // Хэш-код должен использовать те же поля, что и ==
}

void main() {
  final users = <User>{};
  final user1 = User('u1', 'alice@example.com');
  final user2 = User('u1', 'alice.new@example.com'); // Тот же id

  users.add(user1);
  users.add(user2); // Не добавится, так как user2 == user1

  print(users.length); // Вывод: 1
}

Для встроенных типов (String, int, etc.) эти методы уже корректно реализованы.