불변 클래스 인스턴스의 인자는 const 리터럴로 만들어요

불변 클래스 인스턴스의 인자는 const 리터럴로 만들어요

prefer_const_literals_to_create_immutables 린트 규칙은, @immutable 클래스의 생성자 인자로 쓰는 list, map, set 리터럴은 const로 만들라고 권하는 규칙이에요. Stable 상태이고, 코드 수정도 자동으로 가능해요.

출처: Prefer const literals as parameters of constructors on @immutable classes.

본문

불변 클래스(@immutable)의 인스턴스를 만들 때, 인자로 넘기는 리터럴도 그냥 리터럴이 아니라 const 리터럴로 만들어 주는 게 좋아요. 불변 클래스 안에 들어가는 값이라면 애초에 바뀌지 않으니까, 매번 새 컬렉션을 만들 필요 없이 상수로 재사용할 수 있어요.

BAD — 인자로 넘기는 리스트와 맵 리터럴에 const가 없어요.

@immutable
class A {
  A(this.v);
  final v;
}

A a1 = new A([1]);
A a2 = new A({});

GOOD — 리터럴에 const를 붙였어요.

A a1 = new A(const [1]);
A a2 = new A(const {});

new A([1])는 매번 새 리스트를 만들지만, new A(const [1])은 하나의 상수를 재사용해요. 불변 클래스라 어차피 값이 안 바뀌는 상황이니 그게 더 합리적이에요.

규칙 켜기

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

linter:
  rules:
    - prefer_const_literals_to_create_immutables

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

linter:
  rules:
    prefer_const_literals_to_create_immutables: true

더 알아보기

  • 불변 클래스 자체에 const 생성자를 선언하라는 규칙이 궁금하다면 prefer_const_constructors_in_immutables를 봐요.