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