6. 可変長引数
2005.12.06 株式会社四次元データ Co-CTO 江原良典
Java言語機能(JDK5.0(Tiger)新機能) 6章 可変長引数
- 6.1. 可変長引数の定義
6.1. 可変長引数の定義
可変個の引数を持つメソッドを実現したい場合が考えられます。 C言語のprintf関数のような機能です。 そういった場合、これまでのJavaでは配列を用いて実現してきました。
public void printCities(String[] cities){ ... }
printCities(new String[]{"京都", "大阪", "神戸"}); printCities(new String[]{"東京", "千葉"});
非常に面倒です。 そこでJDK5.0からは可変長引数を持つメソッドを定義する機能が追加されました。 可変長引数の定義は、可変長にしたい引数の型の後ろに「...」を追加します。 例えば先ほどの例は以下のようになります。
public void printCities(String... cities){ ... }
呼び出す側も簡単になっており、配列を用いずにすませることができます。
printCities("京都", "大阪", "神戸"); printCities("東京", "千葉");
引数を指定せずに呼び出すことも可能です。
printCities();
さて可変長にされた引数の取り扱いですが、メソッド内では配列として扱います。 引数が指定されなかった場合には、要素0の配列として扱います。 これはコンパイラによって、可変長引数は配列に変換されるからです。
public void printCities(String... cities){ for(int i=0; i < cities.length; i++){ System.out.println(cities[i]); } }
可変長引数は、コンパイラによって配列に変換されると知っておけば難しいことはありません。 しかし配列と異なって、以下のような制約があります。注意してください。
- メソッドが複数の引数をとる場合、最後の引数にしかできません。
また1つのメソッドで1つしか可変長引数を定義できません。 - メソッドがオーバーローディングされていて、引数が固定のメソッドと可変個のメソッドがマッチした場合、前者が優先される。