컬렉션 메서드에 무관한 타입의 인자를 넘기지 말아 주세요

컬렉션 메서드에 무관한 타입의 인자를 넘기지 말아 주세요

컬렉션의 특정 메서드(contains, remove, lookup 등)를 호출할 때 컬렉션 요소와 무관한 타입의 인자를 넘기면, 내부에서 == 비교가 이뤄지고 대부분 false가 나와요. 의도한 동작인지 다시 확인해 보세요.

출처: collection_methods_unrelated_type

본문

특정 컬렉션 메서드를 호출할 때 무관한 타입의 인자를 넘기는 건 피하는 게 좋아요.

이렇게 하면 컬렉션 요소에 대해 ==가 호출되는데, 대부분 false를 반환하게 돼요.

컬렉션 메서드에 넘기는 인자는 컬렉션 타입과 다음과 같은 관계를 가져야 해요.

  • Iterable<E>.contains의 인자는 E와 관련되어야 하고
  • List<E>.remove의 인자는 E와 관련되어야 하며
  • Map<K, V>.containsKey의 인자는 K와 관련되어야 해요
  • Map<K, V>.containsValue의 인자는 V와 관련되어야 하고
  • Map<K, V>.remove의 인자는 K와 관련되어야 하며
  • Map<K, V>.[]의 인자는 K와 관련되어야 해요
  • Queue<E>.remove의 인자는 E와 관련되어야 하고
  • Set<E>.lookup의 인자는 E와 관련되어야 하며
  • Set<E>.remove의 인자는 E와 관련되어야 해요

BAD 예시:

void someFunction() {
  var list = <int>[];
  if (list.contains('1')) print('someFunction'); // LINT
}

BAD:

void someFunction() {
  var set = <int>{};
  set.remove('1'); // LINT
}

GOOD 예시:

void someFunction() {
  var list = <int>[];
  if (list.contains(1)) print('someFunction'); // OK
}

GOOD:

void someFunction() {
  var set = <int>{};
  set.remove(1); // OK
}

활성화하기

collection_methods_unrelated_type 규칙을 활성화하려면 analysis_options.yaml 파일의 linter > rules 아래에 collection_methods_unrelated_type을 추가하면 돼요.

linter:
  rules:
    - collection_methods_unrelated_type

만약 linter 규칙을 YAML 맵 문법으로 설정한다면 linter > rules 아래에 collection_methods_unrelated_type: true라고 적어 주면 돼요.

linter:
  rules:
    collection_methods_unrelated_type: true

더 알아보기