Javaのイニシャライザについて

Javaの初期化と言えば、一般的にはコンストラクタだが、Javaにはスタティックイニシャライザとインスタンスイニシャライザを使って初期化を行う方法があり、今まで知らなかったのでメモしておく。

スタティックイニシャライザとは

スタティックイニシャライザは、主にクラス変数(staticな変数)を初期化するときに使用する。クラス変数の場合はインスタンスを生成しなくても使用できるので、コンストラクタは必要ない。スタティックイニシャライザを使用すると、クラスが初期化される直後にクラス変数を初期化することが出来る。
スタティックイニシャライザ(Static Initializer)は他にも「クラス初期化子」「静的初期化子」「静的ブロック」「staticブロック」とも呼ばれている。

static {}がスタティックイニシャライザである。

class InitializeTest {
    public static int[] foo = new int[100];
    
    //スタティックイニシャライザ
    static {
        for (int i = 0; i <= foo.length; i++) {
            foo[i] = i + 1;
        }
    }
}

この例のように大量の要素を持つ配列を初期化したいときなどは、素直に書くことが出来る。

インスタンスイニシャライザ

インスタンスイニシャライザは、主にインスタンス変数(インスタンスごとに作成される変数)を初期化するときに使用する。インスタンスフィールドの場合、通常はコンストラクタで初期化することが出来る。しかし、通常の初期化ならば問題ないが、例えば、コンストラクタをオーバーロードした場合、複数のコンストラクタ内で共通する処理があるときは、インスタンスイニシャライザへと共通処理を追い出してやることでスッキリと書くことが出来る。

名前の無い{}がインスタンスイニシャライザである。

public class InitializeTest {
    public int[] test = new int[100];
    public boolean foo = false;
    public boolean bar = false;
    
    //インスタンスイニシャライザ
    {
        for (int i = 0; i <= test.length; i++) {
            test[i] = i + 1;
        }
    }
    
    public InitializeTest(int a) {
        foo = true; test[0] = a;
    }
    
    public InitializeTest(int a, int b) {
        bar = true; test[0] = a;
        test[1] = b;
    }
}

参考
イニシャライザ (初期化子)