今日のjavaおっかけ(20150415):可変長引数

さくっと終わるかなと思ったけど、明日にも続きます.

目次とぶっつぶつテーマ

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に可変長引数について書かれている.

途中から意味わからないので、明日に続く…

→ 書きました

snoopopo.hatenablog.com