さくっと終わるかなと思ったけど、明日にも続きます.
目次とぶっつぶつテーマ
http://snoopopo.hatenablog.com/entry/2015/04/14/102732
今日のテーマ:可変長引数
こちらもjava5から登場.
「可変長引数」とググるとjavaよりもc++とかのキーワードが出てくるから、javaで登場する以前からある概念みたいだ.
private static void sysout(String...strings) { for(String str : strings) { System.out.println(str); } System.out.println("-----"); }
引数の String...strings
に注目.これが可変引数を表す構文.
このメソッドを呼ぶ側は以下のような書き方が出来る.
sysout();//引数なし sysout("a"); //単数 sysout("a","b");//複数引数 String[] array = {"array1","array2","array3"}; sysout(array);//配列 sysout((String)null);//nullをStringキャスト sysout((String[])null);//nullをString[]キャスト
これを見てわかる通り、nullと0個以上の引数を渡すことが出来る.
受け取った側のメソッドでは、単純に配列の扱いになる.
オーバーライドされた場合は固定長引数メソッドが優先
private static void sysout(String...strings) { //可変長引数メソッド for(String str : strings) { System.out.println(str); } } private static void sysout(String str) { //固定長引数メソッド System.out.println(str); }
上記のようにオーバーライドされてる場合に、以下のように呼んだ場合は、固定長引数メソッドが呼ばれる.
sysout("a");
可変長引数は一番最後のパラメータにしないといけない.
private static void sysout(int i, String...strings) { //OK. //something. } private static void sysout(int i, String...strings) { //compile error! //something. }
可変長引数は一番最後のパラメータにしないといけない.
渡された引数がなくなるまでをパラメータとするから.
上記の例だと、int 1つの次の引数から最後の引数までを配列として扱うことになる.
そうなると当然、メソッド1つに1つの可変長パラメータになる.(複数可変長パラメータを宣言できない)
nullを渡すとき
nullをそのまま渡すことは出来ない.コンパイルエラーになった.
ただし、上記の通り可変長引数の型にキャストするか、その配列の型にキャストすれば渡せる.
null以外の値を渡すときは、配列にしてから渡す必要はない.上記の複数のStringを渡している例の通り.
だがnullの場合は、(String)nullなのか(String[])nullなのかを渡すときに決めないといけない.
EffectiveJava 項目42 可変長引数を注意して使用する
項目42に可変長引数について書かれている.
途中から意味わからないので、明日に続く…
→ 書きました