Javaのソースで見つけた ...(点3つ) って何?から知る可変長引数


きっかけ

Javaのソースで...(点3つ)の引数を見かけた。

何だ...って?
    private static void printArgs(String description, Object... args) {
        for (Object object : args) {
            System.out.println(object);
        }
    }

...(点3つ)は可変長引数を表します。

可変長引数は、指定された型の引数を複数指定できます。

引数を指定してみる
        // コレでもOK
        printArgs("1つ", "複数");
        // コレもOK
        printArgs("2つ", "複数", "指定");
        // コレもOK
        printArgs("3つ", "複数", "指定", true);
        // コレだってOK
        printArgs("なし");
結果
1つ : 複数
2つ : 複数指定
3つ : 複数指定true
なし : 

可変長引数は、配列を定義したも同然です。

可変長引数のメソッドをコンパイルすると配列になります。

コンパイル後
    public void methodName(String description, Object[] vars)
        メソッドの中身.
    }

可変長引数は、配列も指定できます。

引数に配列も指定できます
// コレでもOK
methodName("配列", new int[]{1,2,3,4,5});
// コレすらOK
methodName("配列と1つ", new int[]{1,2,3,4,5}, "複数");

可変長引数は、使い方に決まりがあります。

配列を引数にとるオーバーロードはダメ
理由 : コンパイルしたら同じになるから

配列を引数にとるオーバーロードはダメ
    public void methodName(String description, Object... vars)
        メソッドの中身.
    }
    public void methodName(String description, Object[] vars)
        メソッドの中身.
    }

可変長引数は最期に指定しないとダメ
理由:たぶん、どこまでが可変長引数に指定している値かわからなくなるから

可変長引数は最期に指定しないとダメ
// argsでコンパイルエラーになり、Eclipseだとこんなメッセージが出ます。(ざっくり訳 : 可変長引数は最後に書いてね)
// 「The variable argument type Object of the method printArgs must be the last parameter」
    private static void printArgs2(Object... args, String description) {
        メソッドの中身.
    }

可変長引数は1つしか指定できない
理由:たぶん、どこからどこまで1つ目かわかんなくなるし、1つ目の可変長引数が最期に指定されていないことになるから

可変長引数は1つしか指定できない
// args2でコンパイルエラーになり、Eclipseだとこんなメッセージが出ます。
// 「The variable argument type Object of the method printArgs must be the last parameter」
    private static void printArgs2(String description, String... args2, Object... args) {
        メソッドの中身.
    }

// こうするとコンパイルエラーにならない
    private static void printArgs2(String description, String[] args2, Object... args) {
        メソッドの中身.
    }

おまけ

JUnitで引数に配列や可変長引数をとるprivateメソッドをテストする方法 - Qiita

可変長引数の説明をしてくれているサイト様