2つのコンストラクターのいずれかを使用してインスタンス化できる多くの最終メンバーを持つクラスがあります。コンストラクターはいくつかのコードを共有し、それは3番目のコンストラクターに格納されます。
// SubTypeOne and SubTypeTwo both extend SuperType
public class MyClass {
private final SomeType one;
private final SuperType two;
private MyClass(SomeType commonArg) {
one = commonArg;
}
public MyClass(SomeType commonArg, int intIn) {
this(commonArg);
two = new SubTypeOne(intIn);
}
public MyClass(SomeType commonArg, String stringIn) {
this(commonArg);
two = new SubTypeTwo(stringIn);
}
問題は、このコードがコンパイルされないことです。Variable 'two' might not have been initialized.
誰かがMyClass内から最初のコンストラクターを呼び出す可能性があり、その場合、新しいオブジェクトには「2つの」フィールドが設定されません。
では、この場合、コンストラクター間でコードを共有するための好ましい方法は何ですか?通常はヘルパーメソッドを使用しますが、共有コードは最終変数を設定できる必要があります。これはコンストラクターからのみ実行できます。