field_initialized_in_initializer_and_declaration 진단: final 필드를 두 곳에서 초기화할 수 없어요

field_initialized_in_initializer_and_declaration 진단: final 필드를 두 곳에서 초기화할 수 없어요

Dart 분석기가 내보내는 진단에는 이름이 있어요. field_initialized_in_initializer_and_declarationfinal 필드가 선언할 때와 생성자의 초기화 리스트(initializer list)에서 둘 다 초기화될 때 분석기가 알려주는 진단이에요. final 필드는 한 번만 값을 할당할 수 있어서, 두 곳 모두에서 초기화하는 건 허용되지 않아요.

출처: field_initialized_in_initializer_and_declaration

본문

설명

final 필드가 필드 선언에서 초기화되고 동시에 생성자의 초기화 리스트에서도 초기화되면 이 진단이 나와요. final 필드는 단 한 번만 값을 할당할 수 있기 때문에, 두 자리 모두에서 초기화할 수는 없어요.

예시

다음 코드는 f가 선언 시점에 이미 값으로 초기화되어 있는데도 생성자에서 다시 초기화하려고 해서 이 진단이 나와요.

class C {
  final int f = 0;
  C() : f = 1;
}

흔한 해결 방법

초기화 값이 생성자로 전달받는 어떤 값에도 의존하지 않고, 모든 생성자가 같은 값으로 필드를 초기화해도 되는 상황이라면 생성자 쪽의 초기화를 빼요.

class C {
  final int f = 0;
  C();
}

반대로 초기화 값이 생성자로 전달받는 값에 의존하거나, 생성자마다 필드를 다르게 초기화해야 한다면 필드 선언 쪽의 초기화를 빼요.

class C {
  final int f;
  C() : f = 1;
}

더 알아보기