`final_not_initialized_constructor`: 생성자가 final 인스턴스 필드를 초기화하지 않아요
final_not_initialized_constructor: 생성자가 final 인스턴스 필드를 초기화하지 않아요
Dart 분석기가 내는 final_not_initialized_constructor 진단에 대해 알아볼게요. 클래스에 초기화 구문이 없는 final 인스턴스 필드가 있는데, 그 필드를 초기화하지 않는 생성자가 하나라도 있으면 이 진단이 나와요.
본문
final 인스턴스 필드가 초기화 구문 없이 하나 이상 정의되어 있고, 그 필드를 초기화하지 않는 생성자가 클래스에 하나 이상 있으면 분석기가 이 진단을 만들어요. 모든 final 인스턴스 필드는 인스턴스가 생성될 때 반드시 초기화되어야 해요. 필드의 초기화 구문으로든 생성자로든 꼭 초기화가 필요하죠.
예시
다음 코드는 이 진단을 만들어요.
class C {
final String value;
C();
}
자주 쓰는 해결 방법
값을 생성자로 직접 전달해야 한다면, 초기화 형식 매개변수(initializing formal parameter)를 사용해서 필드 값을 초기화하면 돼요.
class C {
final String value;
C(this.value);
}
호출자가 제공한 값에서 값을 간접적으로 계산해야 한다면, 매개변수를 추가하고 초기화 구문을 포함하면 돼요.
class C {
final String value;
C(Object o) : value = o.toString();
}
필드의 값이 생성자로 전달할 수 있는 값에 의존하지 않는다면, 필드 선언에 필드 초기화 구문을 추가하면 돼요.
class C {
final String value = '';
C();
}
필드의 값이 생성자로 전달할 수 있는 값에 의존하지 않지만, 생성자마다 다른 값으로 초기화해야 한다면, 초기화 목록(initializer list)에서 필드 초기화 구문을 추가하면 돼요.
class C {
final String value;
C() : value = '';
C.named() : value = 'c';
}
단, 모든 인스턴스에서 값이 같다면 인스턴스 필드 대신 정적(static) 필드를 쓰는 것도 고려해 보세요.
class C {
static const String value = '';
C();
}