yohhoyの日記

技術的メモをしていきたい日記

Double Brace Initializationイディオム

JavaコレクションやネストしたGUIコンポーネントを、1論理行っぽく初期化する方法。Double Brace Initializationイディオム(2重ブレース初期化)とも呼ばれる。

List<String> list = new ArrayList<String>() {{
  add("foo");
  add("bar");
  add("zot");
}};
add(new JPanel() {{
  setLayout(...);
  setBorder(...);
  add(new JLabel(...));
  add(new JSpinner(...));
}});

構文的には外側ブレースが匿名クラス(anonymous class)宣言に、内側ブレースがそのインスタンス初期化子(instance initializer)になっている。濫用すると Foo$1.class などの内部クラスファイルが大量生成されるので注意。また別クラスに分離されることで、JVMクラスローダ処理などパフォーマンス上のペナルティを受ける。

リスト初期化程度であればjava.util.Arraysクラスの利用を検討すべき。

// 固定サイズリスト
List<String> list = Arrays.asList("foo", "bar", "baz");
// サイズ変更可能なリスト
List<String> list = new ArrayList<>(Arrays.asList("foo", "bar", "baz"));

関連URL