インスタンス初期化子と2重ブレースによる初期化

開発者のためのプログラミングQ&Aサイト stackoverflow の Hidden Features of Java というエントリに「Double Brace Initialization」という機能が載ってました。知らなかったので調べたことをまとめます。Double Brace Initialization はインスタンス初期化子のシンタックスシュガーのようです。たぶん…。

インスタンス初期化子(Instance Initializer)

スタティック初期化子とは別にインスタンス初期化子というものがある。コンストラクタの前に実行される。


public class InstanceInitializer {
private int num;

static {
System.out.println("from static initializer");
}

// インスタンス初期化子
{
System.out.println("from instance initializer");
num += 1;
}

public InstanceInitializer() {
num += 1;
System.out.println("from constructor");
}

public static void main(String[] args) {
InstanceInitializer obj = new InstanceInitializer();
System.out.println("num: " + obj.num);
}
}

【出力結果】


from static initializer
from instance initializer
from constructor
num: 2

2重ブレースによる初期化


public static void main(String[] args) {

JFrame frame = new JFrame("Sample") {{
// 2重ブレースによる初期化
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setSize(100, 100);
getContentPane().add(new JButton("button"));
}};

frame.setVisible(true);
}

外側のブレースがクラス定義のブレースで内側のブレースがインスタンス初期化子。匿名インナークラスのインスタンス初期化子で、JFrameのメンバメソッドを呼び出して初期化しています。

【出力結果】