여러 개의 super 이니셜라이저
여러 개의 super 이니셜라이저
A constructor can have at most one 'super' initializer.
이 진단은 생성자의 이니셜라이저 리스트에 수퍼클래스 생성자 호출이 2개 이상 들어있을 때 나타나요. 이니셜라이저 리스트에는 이런 호출이 정확히 하나만 있어야 해요. 명시적이든 암시적이든 상관없이요.
본문
이 애널라이저 진단은 어떤 생성자의 이니셜라이저 리스트에 수퍼클래스 생성자 호출이 하나보다 많이 들어있을 때 발생해요. 이니셜라이저 리스트는 그런 호출을 정확히 하나만 가져야 해요. 명시적으로 써도 되고, 생략해서 암시적으로 처리돼도 괜찮아요.
예시
다음 코드는 B 생성자의 이니셜라이저 리스트가 수퍼클래스 A의 생성자 one과 생성자 two를 둘 다 호출하고 있어서 이 진단이 나와요.
class A {
int? x;
String? s;
A.one(this.x);
A.two(this.s);
}
class B extends A {
B() : super.one(0), super.two('');
}
일반적인 해결 방법
상황에 따라 여러 가지 방법으로 고칠 수 있어요.
1) 하나의 super 생성자가 인스턴스를 완전히 초기화한다면 다른 쪽 호출을 제거해요.
class A {
int? x;
String? s;
A.one(this.x);
A.two(this.s);
}
class B extends A {
B() : super.one(0);
}
2) super 생성자 중 하나가 해주는 초기화를 생성자 본문에서 직접 수행할 수 있다면 그 super 호출을 지우고 본문 안에서 초기화를 해요.
class A {
int? x;
String? s;
A.one(this.x);
A.two(this.s);
}
class B extends A {
B() : super.one(0) {
s = '';
}
}
3) 초기화를 오직 수퍼클래스의 생성자에서만 할 수 있다면 새 생성자를 추가하거나 기존 생성자를 수정해서, 필요한 초기화를 전부 한 번의 호출로 처리할 수 있는 생성자를 만들어요.
class A {
int? x;
String? s;
A.one(this.x);
A.two(this.s);
A.three(this.x, this.s);
}
class B extends A {
B() : super.three(0, '');
}