Java Урок 32: КЛАСС, список аргументов переменной длины
Опубликовано: 01.09.2018
Метод, который принимает переменное количество аргументов, называют методом с переменным количеством аргументов.Ситуации, в которых методу нужно передавать переменное количество аргументов, встречаются не так уж редко.
Скачать исходники для статьи можно ниже
Например, метод, который открывает подключение к Интернету, может принимать имя пользователя, пароль, имя файла, протокол и тому подобное. В этой ситуации было бы удобно передавать только те аргументы, для которых заданные по умолчанию значения не применимы.
Классы - коллекции Stack. Урок 81
До версии J2SE 5 обработка списка аргументов переменной длины могла
выполняться двумя способами, ни один из которых не был особенно удобен. Во-первых, если максимальное количество аргументов было небольшим и известным, можно было создавать перегруженные версии метода — по одной для каждого возможного способа вызова метода. Хотя этот способ и приемлем, но применим только в редких случаях.Урок 2 - Java - Процедурное программирование
Во-вторых, когда максимальное количество возможных аргументов было большим или неизвестным, применялся подход, при котором аргументы сначала помещались в массив, а затем массив передавался методу. Следующая программа иллюстрирует этот подход. // Использование массива для передачи методу переменного // количества аргументов. Это старый стиль подхода // к обработке списка аргументов переменной длины, 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 Содержимое: