Java 可変長引数の使い方

可変長引数は、同一の型の引数について、 呼び出し元から渡される引数の数が不定の場合に有用な方法である。 が、使用方法を誤るといろいろ面倒なことになるそうなので、以下にメモ。

とりあえず、使い方を書いてみる。

        //渡された可変長引数の中から、最長値を返却する
    static int min(int... args) {

        if (args.length == 0) {
            throw new IllegalArgumentException();
        }
        int min = args[0];
        for (int i = 1; i < args.length; i++) {
            if (args[i] < min){
                min = args[i];
            }
        }
        return min;
    }

と、こんな感じで可変長引数は内部で配列になるので、 for文などに使用できる。(当然lengthも持っている。)

さて、とりあえず書いてみたものの、いくつか悪い点がある。 ①引数なしでメソッドを呼び出した場合に、コンパイル時ではなく実行時にエラー ②args(引数)に対する明示的な正当性検査を含めなければならない

対策として、以下のように修正する。

static int min(int firstArg, int...args) {
        int min = firstArg;
        for (int arg : args) {
            if(arg < min) {
                min = arg;
            }
        }
        return min;
    }

見てわかる通り、可変長引数の前に、同じ型の引数を一つ追加する。 こうすることによって、上記の①、②が回避できる。

また、可変長引数は呼び出しのたびに、配列オブジェクトが生成されるため、 コストが大きい。 仮に、上記のメソッドの可変引数の数が3個までのものが多数を占める場合、 引数が0~3個の4つと、引数一つ + 可変長引数のメソッドという具合に オーバーロードしたメソッドを作成することも考えたほうが良い。

static int min (){};
static int min (int first){};
static int min (int first, int second){};
static int min (int first, int second, int third){};
static int min (int firstArg int... args){};

とりあえずこんな感じで。以上。

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)