2013年5月30日

インスタンス生成時にコレクションに詰める

前回の記事で、ArrayListのインスタンスを生成するときに、要素を詰めた状態でnewしていました。

例えばこんな感じです。
List<String> list = new ArrayList<String>() {
    {
        add("element1");
        add("element2");
        add("element3");
    }
};

for (String s : list) System.out.println(s);

Map<String, String> map = new HashMap<String, String>() {
    {
        put("key1", "value1");
        put("key2", "value2");
    }
};

for (Map.Entry<String, String> entry : map.entrySet())
    System.out.println(entry.getKey() + ":" + entry.getValue());

実行結果はこの通り。しっかりと要素が追加されています。
element1
element2
element3
key2:value2
key1:value1

実は前述の記事の参考にしたページにのっていたのですが、長年Javaをやっていましたが、こんな記法を出来るとは知りませんでした。

そこで調べたところ、このクラス、Innerという名前でつくっていたのですが、2つの無名インナークラスが作られていました。
Inner.class
Inner$1.class
Inner$2.class

そしてよくよく調べてみると、初期化ブロックという記法がありました。(http://java.keicode.com/lang/initialize-initialization-block.php)
staticの記法は使った事があったのですが、こんな書き方もあったのですね。

ということで、今回の件は初期化ブロックを定義した無名インナークラスを生成していただけ、ということでした。
わざわざ無名インナークラスにする意味はいまのところ見いだせてないですね。。。

過去に見たコーディングルールでは、

ひとつのソースファイルからクラスファイルが2個以上生成されるのは、1対1にならないからインナークラスは使ってはいけない。

といったよくわからないものがあったことを思い出しました。

0 コメント:

コメントを投稿