2026年1月25日日曜日

【Java】任意の数の引数(可変長引数)を扱う方法と注意点

 

1. 可変長引数とは?

**Java 5(2004年リリース)**から導入された機能です。 メソッドの引数に ...(3つのドット)を記述することで、呼び出し側が任意の数の引数を渡せるようになります。

内部的には配列として処理されるため、メソッド内では配列操作と同じループ処理で値を扱うことができます。



2. サンプルコード

Person クラスのインスタンスを、可変長引数を使ってまとめて出力する実装例です。

Java
class Person {
    private String name_;

    Person(String name) {
        this.name_ = name;
    }

    public String getName_() {
        return name_;
    }

    public void setName_(String name_) {
        this.name_ = name_;
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("No1");
        Person p2 = new Person("No2");
        Person p3 = new Person("No3");

        // 引数が2つの場合
        print_person(p1, p2);
        
        // 引数が3つの場合(呼び出し側で自由に数を変えられる)
        print_person(p1, p2, p3);
    }

    /**
     * 任意の数の引数を出力するメソッド
     * 型の後に「...」を記述して定義する
     */
    public static void print_person(Person... persons) {
        // 内部的には配列として扱われるため、persons.length で数を取得できる
        for (int i = 0; i < persons.length; i++) {
            System.out.println(persons[i].getName_());
        }
    }
}


3. プログラミング・プラクティスとしての視点

実務において、可変長引数は「読める必要はあるが、自分では安易に使わない」のが一つの定石です。

なぜ多用を避けるべきなのか?

  • 設計の曖昧さ: 「いくつでも入る」状態は便利ですが、インターフェースとしての厳密さが失われ、メソッドの役割がぼやけてしまいます。

  • パフォーマンスへの影響: 呼び出しのたびに内部で新しい配列が生成されるため、高頻度で実行されるループ内などではオーバーヘッドになります。

  • ゼロ引数の許容: print_person() のように引数なしで呼ぶことも可能になってしまうため、要素数のチェック処理(バリデーション)が必要になります。

基本的には、List<T> などのコレクションを引数に取る設計にした方が、現代のJava開発においては型安全で、呼び出し側の意図も明確になります。




0 件のコメント:

コメントを投稿

【Java】数学の「ラムダ表現」から学ぶJavaラムダ式の実装と制限

Java 8で導入された「ラムダ式」。そのルーツは数学の「ラムダ計算」にあります。数学的な美しさと、Javaの実装における具体的なメリット・制限を整理して解説します。 1. 数学におけるラムダ表現 通常、関数は $f(x) = x + 1$ のように名前を付けて定義しますが、ラ...