今日のjavaおっかけ(20150416):可変長引数を注意して使用する

EffectiveJavaすごいな.

目次とぶっつぶつテーマ

http://snoopopo.hatenablog.com/entry/2015/04/14/102732

今日のテーマ:可変長引数を注意して使用する

http://snoopopo.hatenablog.com/entry/2015/04/15/164811

昨日の続き。

EffectiveJava 項目42 可変長引数を注意して使用する を見ていく.

1つ以上の引数を受けとりたい場合

public static int max(int n1st, int...nOther){
    int max = n1st;
    for (int n : nOther) {
        if (n1st < n) {
            max = n;
        }
    }
    return max;
}

Arrays.asList()

本項目で挙げられたArrays.asListは配列をListに変換するメソッド

以下のとおりにパラメータが仕様変更されている。

・java1.4まで

public static List asList(Object[] a)

java5

public static <T> List<T> asList(T... a)

上記のように変わったということは、

//String複数
List<String> strList = Arrays.asList("a","b","c");
System.out.println(strList.size());

こういう↑渡し方が出来るようになった.

これは、以下と同じ.

//String[]
String[] strArray = {"a","b","c"};
List<String> strArrayList = Arrays.asList(strArray);
System.out.println(strArrayList.size());

asListの中で配列作るか、asListを呼んだ側で作った配列を渡すかの違い.

どちらもStringインスタンス3つを保持したListが出来ている.

ここまではクラスの話.intなどといったプリミティブ型はどうなるのか.

//int複数
List<int> intList = Arrays.asList(1,2,3); //コンパイルエラー!
System.out.println(intList.size());

まず、上記のような書き方は出来ない.

ListT はクラスじゃないといけないからね.

//int[]
int[] intArray = {1,2,3};
List<int[]> intArrayList = Arrays.asList(intArray);
System.out.println(intArrayList.size());

しかし、これ↑はかける.

intが1つ保持されたListが出来る.

java1.4までは、パラメータが Object であったため、 int[] はコンパイル時に型違いのエラーが出てたが、検知できなくなった.

asListで変換したものがクラス型とプリミティブ型配列かで挙動が変わってしまうことになる.

パフォーマンス

可変長引数を配列にする処理をすることになるので、当然固定長引数よりも重くなる.