diagnostics_hash_and_equals 진단: `==`와 `hashCode`를 함께 오버라이드해야 해요

diagnostics_hash_and_equals 진단: ==hashCode를 함께 오버라이드해야 해요

Dart 분석기가 내보내는 진단에는 이름이 있어요. hash_and_equals== 연산자와 hashCode 게터 중 하나만 오버라이드했을 때 분석기가 알려주는 린트(lint) 진단이에요. 두 메서드는 서로 일관돼야 해서, 하나만 오버라이드하면 해시 기반 컬렉션에서 문제가 생길 수 있어요.

출처: hash_and_equals

본문

설명

분석기는 클래스나 믹스인(mixin)이 == 정의는 오버라이드했는데 hashCode 정의는 오버라이드하지 않았거나, 그 반대로 hashCode 정의는 오버라이드했는데 == 정의는 오버라이드하지 않았을 때 이 진단을 만들어요.

== 연산자와 객체의 hashCode 프로퍼티는 일반적인 해시 맵 구현이 제대로 동작하려면 서로 일관돼야 해요. 따라서 둘 중 하나를 오버라이드할 때는 둘 다 오버라이드해야 해요.

예시

다음 코드는 클래스 C== 연산자는 오버라이드했지만 hashCode 게터는 오버라이드하지 않기 때문에 이 진단이 발생해요:

class C {
  final int value;

  C(this.value);

  @override
  bool operator ==(Object other) =>
      other is C && other.runtimeType == runtimeType && other.value == value;
}

일반적인 수정 방법

두 멤버 중 하나를 오버라이드해야 한다면 다른 쪽도 함께 오버라이드해요:

class C {
  final int value;

  C(this.value);

  @override
  bool operator ==(Object other) =>
      other is C && other.runtimeType == runtimeType && other.value == value;

  @override
  int get hashCode => value.hashCode;
}

두 멤버 중 어느 것도 오버라이드할 필요가 없다면, 불필요한 오버라이드를 제거해요:

class C {
  final int value;

  C(this.value);
}

더 알아보기