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

は配列なので、通常の配列を扱うのと同じようにそれらを扱う必要があります。


4ルール


Varargs

は使い方が簡単です。ただし、注意しなければならない規則がいくつかあります。

  • 各メソッドは

    varargs

    パラメータを1つだけ持つことができます


  • varargs

    引数は最後のパラメータでなければなりません


5可変引数の安全な使用


  • varargs

    を使用すると、いわゆるhttps://en.wikipedia.org/wiki/Heap__pollution[Heap Pollution]になる可能性があります。

簡単に言えば、これは、Javaが

varargs

を一般的な

Object

インスタンスとして扱うことを意味します。これは、後で

__ClassCastException

__につながる可能性があります。

これは

varargs

が安全ではないという意味ではありません。

String

のような具象型を扱うときは安全ですが、総称を利用するのはそれほど簡単ではないかもしれません。

致命的なランタイム例外が発生する可能性があるため、JavaコンパイラまたはIDEでは次のような警告が表示されることがあります。

warning:[varargs]Possible heap pollution from parameterized vararg type T

メソッド自体が悪意のある変換やタイプキャストを行わないことを確認したら、https://docs.oracle.com/javase/7/docs/api/java/lang/SafeVarargs.html[

@SafeVarargs

]警告を抑制します。


6. 結論


Varargs

は多くの定型句をJavaで消滅させる可能性があります。

そして、それらの暗黙のうちの

Arrayとの間の

自動ボックス化__のおかげで、それらは将来の私たちのコードの校正において役割を果たします。

いつものように、この記事のすべてのコード例はhttps://github.com/eugenp/tutorials/tree/master/core-java-lang-syntax[GitHub repository]にあります。