static finalなコレクションの生成について

コレクションの初期化にはスタティックイニシャライザではなくインスタンスイニシャライザを使用する - cypher256's blog
まず、static finalな配列をpubilcで公開すると要素が書き換えられてしまう。
こんな感じ

public class StaticFinalSample {

	public static void main(String[] args) {

		StaticFinalBean.SAMPLE[0] = "uuuu";

		for (String string : StaticFinalBean.SAMPLE) {
			System.out.println(string);
		}

	}

}

public class StaticFinalBean {

	public static final String[] SAMPLE = {"aaaa","iiii"};
}

結果

uuuu
iiii

staticイニシャライザを使った初期化

	public static final List<String> LIST;
	static {
		List<String> tmp = new LinkedList<String>();
		tmp.add("要素1");
		tmp.add("要素2");
		LIST = Collections.unmodifiableList(tmp);
	}

pubilc static finalなコレクションって、あまり使った事無かったけど(privateはよく使う)、publicならCollections.unmodifiable***メソッド使えば不変なコレクションが作れる。このメソッド、初めて知りました。

で、一番すげーって思ったのが↓

	public static final List<String> LIST = Collections
			.unmodifiableList(new LinkedList<String>() {
				{
					add("要素1");
					add("要素2");
				}
			});

Collections.unmodifiableListの引数にLinkedListを親とする匿名クラスを渡す。匿名クラスはコンストラクタを書く事ができないので、インスタンスイニシャライザを使用して初期化する。

今まで、インスタンスイニシャライザってどうゆう使い道あるんだろうって思ってたけど、こういう使い方があるのはじめて知りました。
勉強になりました。