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