デフォルトコンストラクタとインラインフィールド初期化 質問する

デフォルトコンストラクタとインラインフィールド初期化 質問する

デフォルト コンストラクターとオブジェクトのフィールドを直接初期化することの違いは何ですか?

次の例のいずれかを他の例よりも優先する理由は何ですか?

例1

public class Foo
{
    private int x = 5;
    private String[] y = new String[10];
}

例2

public class Foo
{
    private int x;
    private String[] y;

    public Foo()
    {
        x = 5;
        y = new String[10];
    }
}

ベストアンサー1

初期化子はコンストラクタ本体の前に実行されます。(初期化子とコンストラクタの両方がある場合、コンストラクタ コードは 2 番目に実行され、初期化された値をオーバーライドします)

初期化子は、常に同じ初期値が必要な場合(例のように、指定されたサイズの配列や特定の値の整数など)に適していますが、それが有利に働くことも不利に働くこともあります。

変数を異なる方法で(つまり、異なる値で)初期化するコンストラクターが多数ある場合、変更が上書きされ無駄になるため、初期化子は役に立ちません。

一方、同じ値で初期化するコンストラクターが多数ある場合は、初期化を 1 か所にまとめることで、コード行数を節約できます (また、コードの保守性も若干向上します)。

Michael が言ったように、好みの問題もあります。コードを 1 か所にまとめたい場合もあるでしょう。ただし、コンストラクタが多数ある場合は、いずれにしてもコードは 1 か所にまとめられないので、初期化子の方が好ましいでしょう。

おすすめ記事