Varargsは、メソッドが同じ型の可変(任意の)数の引数を受け取ることを可能にする特別な構文です。メソッドの宣言では、そのパラメータはType... name(例えば、int... nums)として示されます。メソッド内部では、引数は通常の配列として扱われます。
例:
public void printNumbers(int... nums) { for (int n : nums) { System.out.print(n + " "); } }
メソッドは次のように呼び出すことができます:
printNumbers(1, 2, 3, 4); // または printNumbers();
内部実装: varargsを持つメソッドを呼び出すと、コンパイラは自動的に対応する型の配列を生成します。
制約と注意点:
printNumbers(null)は、反復処理を試みるとNPEを引き起こします。質問:「複数のvarargsパラメータを持つメソッドを宣言できますか?」
よくある誤解:多くの人は、public void example(int... a, String... b)を宣言できると考えますが、これによりコンパイルエラーが発生します。
正しい答え:いいえ、varargsパラメータは1つだけが可能であり、それは最後でなければなりません。
ストーリー
企業のロギングライブラリには、varargsおよび配列を持つオーバーロードされたメソッドのバージョンが実装されました。配列を要素のセットの代わりに渡すと、誤ったメソッドが選択され、配列がオブジェクトとして記録され、その内容としてではなく、ログ解析時に混乱を引き起こしました。
ストーリー
統合サービスでは、varargsを持つメソッドがnullを受け入れ、NPEを確認せずに要素を反復処理しようとしたため、システムは予期せず「クラッシュ」しました。少なくとも空の配列が期待されていました。
ストーリー
あるeコマースプロジェクトでは、メソッドのオーバーロードで混乱しました:
send(String subject, String... emails)というメソッドとsend(String subject, String[] emails)という別のメソッドがありました。配列を渡すと、コンパイラは不適切なメソッドを暗黙的に選択しました。結果として、メールが顧客に送信されませんでした。