15

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つの」フィールドが設定されません。

では、この場合、コンストラクター間でコードを共有するための好ましい方法は何ですか?通常はヘルパーメソッドを使用しますが、共有コードは最終変数を設定できる必要があります。これはコンストラクターからのみ実行できます。

4

4 に答える 4

18

これはどう?(変更された質問のために更新されました)

public class MyClass {

    private final SomeType one;
    private final SuperType two;

    public MyClass (SomeType commonArg, int intIn) {
        this(commonArg, new SubTypeOne(intIn));
    }

    public MyClass (SomeType commonArg, String stringIn) {
        this(commonArg, new SubTypeTwo(stringIn));
    }

    private MyClass (SomeType commonArg, SuperType twoIn) {
        one = commonArg;
        two = twoIn;
    }
}
于 2013-02-15T23:01:49.470 に答える
6

すべてのコンストラクターで、すべての最終変数を初期化していることを確認する必要があります。私がすることは、すべての変数を初期化する1つのコンストラクターを持ち、他のすべてのコンストラクターがそれを呼び出し、null値が指定されていないフィールドがある場合はデフォルト値を渡すことです。

例:

public class MyClass {
    private final SomeType one;
    private final SuperType two;

    //constructor that initializes all variables
    public MyClas(SomeType _one, SuperType _two) {
        one = _one;
        two = _two;
    }

    private MyClass(SomeType _one) {
        this(_one, null);
    }

    public MyClass(SomeType _one, SubTypeOne _two) {
        this(_one, _two);
    }

    public MyClass(SomeType _one, SubTypeTwo _two) {
        this(_one, _two);
    }
}
于 2013-02-15T23:04:29.093 に答える
1

必要なのは、「2」が初期化されることを確認することだけです。最初のコンストラクターで、次を追加するだけです。

two = null;

最初のコンストラクターのみが呼び出されるイベントで指定したい他の値がない限り。

于 2013-02-15T23:01:33.427 に答える
0

MyClass(SomeType oneIn)を呼び出した場合、が初期化されていないため、このエラーが発生しtwoます。

于 2013-02-15T23:03:04.380 に答える