私は2つのコンストラクタのうちの1つを使用してインスタンス化できる多くの最終メンバーを持つクラスを持っています。コンストラクタは、第3のコンストラクタに格納されているコードを共有します。Javaの最終フィールドを初期化する
// 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」のフィールドが設定されていないだろう。
この場合、コンストラクタ間でコードを共有するにはどうすればよいでしょうか?通常はヘルパーメソッドを使用しますが、共有コードはコンストラクタからのみ実行できる最終変数を設定できる必要があります。
それは、現在あなたが2つの*同じ*コンストラクタ(同じパラメータ、同じボディを)持っているあなたの質問を理解するのは難しいです。より代表的になるように修正できますか? –
最初のコンストラクタでは、2つが初期化されません。 –
@Jon Skeet - もう一度見てください。パラメータの種類は異なります。 –