Javaの可変引数
1. 前書き
VarargsはJava 5で導入され、1つのタイプの任意の数のパラメーターをサポートするメソッドの省略形を提供します。
この記事では、このコアJava機能をどのように使用できるかを説明します。
2. Varargsの前
Java 5より前は、任意の数の引数を渡す場合は常に、すべての引数を配列で渡すか、N個のメソッド(追加のパラメーターごとに1つ)を実装する必要がありました。
public String format() { ... }
public String format(String value) { ... }
public String format(String val1, String val2) { ... }
3. Varargsの使用
Varargsは、内部の配列を使用して、任意の数のパラメーターを自動的に処理できる新しい構文を導入することにより、定型コードの記述を回避するのに役立ちます。
標準の型宣言とそれに続く省略記号を使用して定義できます。
public String formatWithVarArgs(String... values) {
// ...
}
そして、次のように、任意の数の引数を使用してメソッドを呼び出すことができます。
formatWithVarArgs();
formatWithVarArgs("a", "b", "c", "d");
前述のように、varargs are arrays so we need to work with them just like we’d work with a normal array.
4. 規則
Varargsは簡単に使用できます。 ただし、留意しなければならないルールがいくつかあります。
-
各メソッドは1つのvarargsパラメータのみを持つことができます
-
varargs引数は最後のパラメーターでなければなりません
5. 可変引数の安全な使用
varargsを使用すると、いわゆるHeap Pollutionにつながる可能性があります。
簡単に言えば、これは、Javaがvarargsを汎用のObjectインスタンスとして処理し、後でClassCastExceptionsにつながる可能性があることを意味します。
これは、varargsが安全でないという意味ではありません。 Stringのような具象型を扱う場合は安全ですが、ジェネリックスを利用するのはそれほど簡単ではないかもしれません。
致命的なランタイム例外の潜在的なリスクがあるため、JavaコンパイラまたはIDEは次のような警告を表示する場合があります。
warning: [varargs] Possible heap pollution from parameterized vararg type T
メソッド自体が悪意のある変換や型キャストを行わないことを確認した場合は、@SafeVarargsを使用して警告を抑制することができます。
6. 結論
Varargsは、Javaで多くの定型文をなくすことができます。
また、Array,との間の暗黙的なautoboxingのおかげで、将来的にコードを保証する役割を果たします。
いつものように、この記事のすべてのコード例は、GitHub repositoryで入手できます。