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で変換したものがクラス型とプリミティブ型配列かで挙動が変わってしまうことになる.
パフォーマンス
可変長引数を配列にする処理をすることになるので、当然固定長引数よりも重くなる.