2013年4月30日火曜日

[Java]Instance Initializerっていうのがあります

Javaで、インスタンスを初期化するのはコンストラクタですが、コンストラクタと同等の初期化を実施することができる、Instance Initializerというのがあります。コードはこんな感じ。
public static void main(String[] args) {

    new ExtendClass();

}

static class BaseClass {

    {
        System.out.println("BaseClass{}1");
    }

    {
        System.out.println("BaseClass{}2");
    }

    public BaseClass() {
        System.out.println("BaseClass()");
    }
}

static class ExtendClass extends BaseClass {

    {
        System.out.println("ExtendClass{}1");
    }

    public ExtendClass() {
        System.out.println("ExtendClass()");
    }

    {
        System.out.println("ExtendClass{}2");
    }
}
普通のメソッド同様に、ローカル変数やsuper/thisなどのキーワードを使うことができます。

■実行結果
BaseClass{}1
BaseClass{}2
BaseClass()
ExtendClass{}1
ExtendClass{}2
ExtendClass()

Static InitializerもInstance Initializerも複数個所に分断してかけますが、分断するとわかりづらくなります。 しかし、以下のような初期化の仕方はありじゃないでしょうか。 個人的な感覚ですが、コレクションの初期化については、コンストラクタや統一ブロックで処理するよりわかりやすくなると思います。
static class SetInitClass {

    final private Collection<Integer> set1;
    {
        Set<Integer> set = new HashSet<Integer>();
        set.add(1);
        set.add(3);
        set.add(5);
        set1 = Collections.unmodifiableCollection(set);
    }

    final private Collection<Integer> set2;
    {
        Set<Integer> set = new HashSet<Integer>();
        set.add(2);
        set.add(4);
        set.add(6);
        set2 = Collections.unmodifiableCollection(set);
    }

}

0 件のコメント: