スーパークラスのフィールドは自身のコンストラクターで初期化し、サブクラス内でそのコンストラクターに委譲することが望ましいとされています。 これにより、あるフィールドがコンストラクターを実行後に変更されていない場合に final として宣言することも可能になります。
例:
class Super {
int x;
}
class Sub extends Super {
Sub(int _x) {
// 警告: x はスーパークラスで宣言されています
x = _x;
}
}
この問題を回避するため、スーパークラスのコンストラクターを宣言します:
class Super {
final int x;
Super(int _x) {
x = _x;
}
}
class Sub extends Super {
Sub(int _x) {
super(_x);
}
}