상수 Map의 키는 '==' 연산자나 'hashCode'를 재정의할 수 없어요
상수 Map의 키는 '==' 연산자나 'hashCode'를 재정의할 수 없어요
상수 Map을 만들 때 키로 쓰는 객체는 몇 가지 제약이 있어요. 키의 타입이 == 연산자나 hashCode를 재정의하고 있으면 컴파일 시점에 문제가 생길 수 있거든요. 왜 그런지, 그리고 어떻게 고치는지 차근차근 설명해 드릴게요.
본문
Description
Dart 분석기는 상수 Map 리터럴의 키로 사용된 객체의 클래스가 == 연산자나 hashCode getter 중 하나(혹은 둘 다)를 구현하고 있을 때 이 진단을 내요. 상수 Map의 구현은 == 연산자와 hashCode getter를 둘 다 사용하는데, Object에서 상속받은 구현이 아닌 다른 구현은 컴파일 시점에 임의의 코드를 실행해야 해서 지원되지 않거든요.
Examples
아래 코드는 상수 Map의 키 타입이 C인데, 클래스 C가 == 구현을 재정의했기 때문에 이 진단이 발생해요.
class C {
const C();
@override
bool operator ==(Object other) => true;
}
const map = {C(): 0};
아래 코드는 상수 Map의 키 타입이 C인데, 클래스 C가 hashCode 구현을 재정의했기 때문에 이 진단이 발생해요.
class C {
const C();
@override
int get hashCode => 3;
}
const map = {C(): 0};
Common fixes
클래스에서 ==와 hashCode의 구현을 제거할 수 있다면, 제거해 주면 돼요.
class C {
const C();
}
const map = {C(): 0};
클래스에서 ==와 hashCode의 구현을 제거할 수 없다면, Map을 non-constant로 만들어 주면 돼요.
class C {
const C();
@override
bool operator ==(Object other) => true;
}
final map = {C(): 0};