상수 Set의 요소는 '==' 연산자나 'hashCode'를 재정의할 수 없어요

상수 Set의 요소는 '==' 연산자나 'hashCode'를 재정의할 수 없어요

상수 Set에 넣는 요소의 타입도 상수 Map의 키와 비슷한 제약을 받아요. 요소 타입이 == 연산자나 hashCode를 재정의하고 있으면 컴파일 시점에 문제가 생길 수 있어요. 왜 그런지, 어떻게 고치는지 함께 확인해 볼게요.

출처: const_set_element_not_primitive_equality

(이전에는 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인데, 클래스 ChashCode 구현을 재정의했기 때문에 이 진단이 발생해요.

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

더 알아보기