Метод, который принимает переменное количество аргументов, называют методом с переменным количеством аргументов.Ситуации, в которых методу нужно передавать переменное количество аргументов, встречаются не так уж редко.
Скачать исходники для статьи можно ниже
Например, метод, который открывает подключение к Интернету, может принимать имя пользователя, пароль, имя файла, протокол и тому подобное. В этой ситуации было бы удобно передавать только те аргументы, для которых заданные по умолчанию значения не применимы.
До версии J2SE 5 обработка списка аргументов переменной длины могла
выполняться двумя способами, ни один из которых не был особенно удобен.
Во-первых, если максимальное количество аргументов было небольшим и известным, можно было создавать перегруженные версии метода — по одной для каждого возможного способа вызова метода. Хотя этот способ и приемлем, но применим только в редких случаях.
Во-вторых, когда максимальное количество возможных аргументов было большим или неизвестным, применялся подход, при котором аргументы сначала помещались в массив, а затем массив передавался методу. Следующая программа иллюстрирует этот подход.
// Использование массива для передачи методу переменного // количества аргументов. Это старый стиль подхода // к обработке списка аргументов переменной длины, class PassArray { static void vaTest(int v[]) { System.out.print("Количество аргументов: " + v.length + " Содержимое: ") ; for(int x : v) System.out.print(x + " "); System.out.println(); } public static void main(String args[]){ // Обратите внимание на способ создания массива // для хранения аргументов. int n1[] = { 10 } ; int n2[] = { 1, 2 , 3 }; int n3[] = { } ; vaTest(nl); // 1 аргумент vaTest(n2); // 3 аргумента vaTest(n3); // без аргументов } }
Эта программа создает следующий вывод.
Количество аргументов: 1 Содержимое: 10
Количество аргументов: 3 Содержимое: 1 2 3
Количество аргументов: 0 Содержимое:
В программе методу vaTest() аргументы передаются через массив v. Этот старый подход к обработке списка аргументов переменной длины позволяет методу vaTest() принимать любое количество аргументов.
Однако он требует, чтобы эти аргументы были вручную помещены в массив до вызова метода vaTest().
Создание массива при каждом вызове метода vaTest() — задача не только трудоемкая, но и чревата ошибками. Возможность использования методов с переменным количеством аргументов обеспечивает более простой и эффективный подход.
Для указания списка аргументов переменной длины используют три точки (. . .).
Например, вот как метод vaTest () можно записать с использованием списка аргументов переменной длины.
static void vaTest(int ... v) {
Эта синтаксическая конструкция указывает компилятору, что метод vaTest() может вызываться без аргументов или с несколькими аргументами.
В результате массив v неявно объявляется как массив типа int[ ]. Таким образом, внутри метода vaTest() доступ к массиву v осуществляется с использованием синтаксиса обычного массива.
Предыдущая программа с применением метода с переменным количеством аргументов приобретает следующий вид.
// Демонстрация использования списка аргументов переменной длины, class VarArgs { // теперь vaTest() использует список аргументов переменной длины, static void vaTest(int ... v) { System.out.print("Количество аргументов: " + v.length + " Содержимое: "); for(int x : v) System.out.print(x + " "); System.out.println(); } public static void main(String args[]){ // Обратите внимание на возможные способы вызова // vaTest() с переменным количеством аргументов. vaTest(10); // 1 аргумент vaTest(1, 2, 3); // 3 аргумента vaTest(); // без аргументов } }
Вывод этой программы совпадает с выводом исходной версии.
Отметим две важные особенности этой программы.
Во-первых, как уже было сказано, внутри метода vaTest() переменная v действует как массив. Это обусловлено тем, что переменная v является массивом. Синтаксическая конструкция . . . просто указывает компилятору, что метод будет использовать переменное количество аргументов, и, что эти аргументы будут храниться в массиве, на который
ссылается переменная v.
Во-вторых, в методе main() метод vaTest() вызывается с различным количеством аргументов, в том числе и вовсе без аргументов. Аргументы
автоматически помещаются в массив и передаются переменной v. В случае отсутствия аргументов длина массива равна нулю.
Наряду с параметром с переменным количеством аргументов массив может
содержать “нормальные” параметры. Однако параметр с переменным количеством аргументов должен быть последним параметром, объявленным методом.
Например, следующее объявление метода вполне допустимо:
int dolt(int a, int b, double с, int ... vals) {
В данном случае первые три аргумента, указанные в обращении к методу
dolt(), соответствуют первым трем параметрам. Все остальные аргументы считаются принадлежащими параметру vals.
Существует еще одно ограничение, о котором следует знать: метод должен содержать только одни параметр с переменным количеством аргументов.
Например,следующее объявление также неверно.
int dolt(int a, int b, double с, int ... vals, double ... morevals) { // Ошибка!
Попытка объявления второго параметра с переменным количеством аргументов недопустима.
Рассмотрим измененную версию метода vaTest(), которая принимает обычный аргумент и список аргументов переменной длины.
// Использование списка аргументов переменной длины совместно //со стандартными аргументами, class VarArgs2 { //В этом примере msg — обычный параметр, // a v — параметр vararg. static void vaTest(String msg, int ... v) { System.out.print(msg + v.length + " Содержимое: "); for(int x : v) System.out.print(x + " "); System.out.println() ; } public static void main(String args[]){ vaTest("Один параметр vararg: ", 10); vaTest("Три параметра vararg: ", 1, 2, 3); vaTest("Без параметров vararg: "); } }
Вывод этой программы таков:
Один параметр vararg: 1 Содержимое: 10
Три параметра vararg: 3 Содержимое: 1 2 3
Без параметров vararg: 0 Содержимое: