Java - seznamy argumentů proměnné délky

V minulých verzích vytvoření metody která přebírala větší množství hodnot vyžadovalo vytvořit pole a vložit do něj hodnoty před voláním metody. Například, tady je způsob jakým se musela používat třída MessageFormat k zformátování zprávy:

	Object[] arguments = {
		new Integer(7), new Date(), "a disturbance in the Force"};
	String result = MessageFormat.format("At {1, time} on {1, date}, there was {2} on planet "
		+ "{0, number, integer}.", arguments);

Je stále pravda že vícenásobné argumenty (multiargumenty) musí být vloženy do pole, ale nová vlastnost kterou je proměnná délka seznamu argumentů tento proces automatizuje a skrývá. Více než to, je zpětně kompatibilní s předešlými API. takže, například, metoda MessageFormat.format má nyní tuto deklaraci:

	public static String format(String pattern, Object... arguments);

Tři tečky za posledním typem parametru znamenají že poslední jako argument může být předáno pole nebo seznam argumentů. Seznamy argumentů proměnné délky mohou být použity pouze u posledního typu argumentu. Díky nové deklaraci metody MessageFormat.format, můžeme nyní volat tuto metodu kratším způsobem:

	String result = MessageFormat.format("At {1, time} on {1, date}, there was {2} on planet "
		+ "{0, number, integer).", 7, new Date(), "a disturbance in the Force");

existuje silná vazba(synergie) mezi automatickým obalováním objektů (autoboxing) a seznamy argumentů proměnné délky, které ilustruje následující příkad který používá reflexi:

// Jednoduchý testovací rámec
public class Test {
	public static void main(String[] args) {
		int passed = 0;
		int failed = 0;
		for (String className : args) {
			try {
				Class c = Class.forName(className);
				c.getMethod("test").invoke(c.newInstance());
				passed++;
			} catch (Exception ex) {
				System.out.printf("is failed: %s%n", className, ex);
				failed++;
			}
		}
		System.out.printf("passed=%id; failed=%d%n", passed, failed);
	}
}

Tento program je kompletní miniaturní testovací rámec. Jako argumenty příkazového řádku přebírá seznam jmen tříd. Pro každé jméno třídy vytváří instanci pomocí jejího bezparametrického konstruktoru a volá bezparametrickou metodu nazvanou test. Pokud vytváření objektu nebo volání metody vyhodí výjimku, je test shledán neúspěšným. Tento program vypíše každé selhání, následované výsledky testů. Pro reflexivní vytváření objektů a volání metod už nikdy více nemusíme vytvářet pole, protože metody getMethod a invoke přijímají seznamy argumentů proměnné délky. tento program také používá metodu printf, které spoléhá na seznamy argumentů proměnné délky. Program je více čitelnější než by bez těchto seznamů kdy byl.

Takže kdy používat seznamy argumentů proměnné délky? Jako klienti byste je měli použít kdykoli vám je API nabízí. Důležité případy použití v API jsou reflexe, formátování zpráv a neová metoda printf. Jako autoři API byste je měli používat střídmě, jen pokud je jejich použití skutečně přínosem. Obecně byste neměli přetěžovat tyto metody, protože bude pro programátory těžké říci ktreá přetížená metoda se bude volat.