1. 可変長引数とは?
**Java 5(2004年リリース)**から導入された機能です。
メソッドの引数に ...(3つのドット)を記述することで、呼び出し側が任意の数の引数を渡せるようになります。
内部的には配列として処理されるため、メソッド内では配列操作と同じループ処理で値を扱うことができます。
2. サンプルコード
Person クラスのインスタンスを、可変長引数を使ってまとめて出力する実装例です。
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 件のコメント:
コメントを投稿