파라미터는 재할당하지 않으면 final로 선언해요

파라미터는 재할당하지 않으면 final로 선언해요

prefer_final_parameters 린트 규칙은 함수 바디 안에서 재할당하지 않는 파라미터는 final로 선언하라고 권하는 규칙이에요. Dart 2.14에서 도입되었고 자동 수정도 가능해요.

출처: Prefer final for parameter declarations if they are not reassigned.

본문

참고: 이 린트 규칙은 Dart 3.11에서 deprecated(사용 중단) 되었고, Dart SDK의 향후 릴리스에서 제거될 예정이에요. 또한 primary-constructors 언어 기능에 opt-in한 코드에는 이 린트가 적용되지 않는데, 그 기능에서는 파라미터에 final을 쓰는 게 컴파일 타임 에러가 되기 때문이에요. 함수 바디 안에서 파라미터가 재할당되지 않도록 확실히 하고 싶다면, 대신 parameter_assignments 린트 규칙을 켜는 걸 고려해 보세요.

함수 바디 안에서 재할당하지 않는 파라미터는 final로 선언하세요.

파라미터를 가능하면 final로 선언하는 게 좋은 습관인 이유는, 실수로 값을 다시 바꾸는 일을 막아 주기 때문이에요.

BAD — 파라미터를 재할당하지 않는데 final이 아니에요.

void badParameter(String label) { // LINT
  print(label);
}

GOODfinal로 선언했어요.

void goodParameter(final String label) { // OK
  print(label);
}

BAD — 표현식 함수 바디에서도 동일하게 적용돼요.

void badExpression(int value) => print(value); // LINT

GOOD

void goodExpression(final int value) => print(value); // OK

BAD — 클로저 파라미터에도 적용돼요.

[1, 4, 6, 8].forEach((value) => print(value + 2)); // LINT

GOOD

[1, 4, 6, 8].forEach((final value) => print(value + 2)); // OK

GOOD — 실제로 값을 바꾼다면 final이 아니어도 괜찮아요.

void mutableParameter(String label) { // OK
  print(label);
  label = 'Hello Linter!';
  print(label);
}

함께 쓰면 안 되는 규칙

prefer_final_parameters 린트는 다음 규칙과 충돌해요.

  • unnecessary_final
  • avoid_final_parameters

규칙 켜기

analysis_options.yaml 파일의 linter > rules 아래에 prefer_final_parameters를 추가하면 돼요.

linter:
  rules:
    - prefer_final_parameters

YAML 맵 문법으로 설정한다면 이렇게 써요.

linter:
  rules:
    prefer_final_parameters: true

더 알아보기

  • 이 규칙은 deprecated 상태이니, 새 코드에는 parameter_assignments 규칙을 고려해 보세요.