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);
}