デフォルト コンストラクターとオブジェクトのフィールドを直接初期化することの違いは何ですか?
次の例のいずれかを他の例よりも優先する理由は何ですか?
例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 か所にまとめられないので、初期化子の方が好ましいでしょう。