よんちゅBlog

― このブログは自分用のメモや日々の問題などを共有するためのものです ―

20121005185841 お知らせ:  2013/07/17 ブログデザインをリニューアルしました。

Java可変長引数メソッドの呼び出しいろいろ

Javaの可変長引数(valiableArityMethod)は、Java1.5より新たに追加された機能で、printfなどの実装に使われています。
あまり自分で実装することのない機能なので、いざ使おうとすると思わなくところではまったりします。
可変長引数を実装したメソッドが予想外の呼ばれ方をしてエラーが発生したり…

というわけで、以下可変長引数メソッドの呼ばれ方と結果を載せておく。

/**
 * 可変長引数テストメソッド
*/
public final void valiableArityMethod() {
    String[] params = { "a", "b", "c" };
    // 普通に呼び出し
    method(params);

    // 引数なし
    method();

    // 空配列
    method(new String[] {});

    // null  ※コンパイラ警告あり
    method(null);

    // 配列でキャストしたnull
    method((String[]) null);

    // 配列の型でキャストしたnull : 可変長引数に対して1個(値がnull)の引数が渡されたという意味になる
    method((String) null);
}

/**
 * 可変長引数実装メソッド
*/
private void method(final String... params) {
    // ※配列の中身を出力したい場合にparams.toString()としない <- ここ重要
    System.out.println(Arrays.toString(params));
}

実行結果は以下のようになります。

[a, b, c]
[]
[]
null
null
[null]

ここで注意しいたのは、メソッドにnullが渡される可能性があるということ。
うっかりnullチェックを忘れると実行時にエラーが発生するので注意が必要。

さらに、要素にnullが含まれる配列が渡される可能性もあるのでここも注意が必要。

※ method(null) について
可変長引数にnullを指定した場合、「呼び出しが曖昧である」という警告が発生します。

※これは「配列がnull(引数が無い)」なのか「nullが1つというデータ」なのか分からないためです。