Сышышь ты, выходи сюда,
поговорим !

Java Урок 32: КЛАСС, список аргументов переменной длины

Опубликовано: 01.09.2018

видео Java Урок 32: КЛАСС, список аргументов переменной длины

Классы. Динамическая диспетчеризация методов. Урок 69

Метод, который принимает переменное количество аргументов, называют методом с переменным количеством аргументов.Ситуации, в которых методу нужно передавать переменное количество аргументов, встречаются не так уж редко.



Скачать исходники для статьи можно ниже

Например, метод, который открывает подключение к Интернету, может принимать имя пользователя, пароль, имя файла, протокол и тому подобное. В этой ситуации было бы удобно передавать только те аргументы, для которых заданные по умолчанию значения не применимы.


Классы - коллекции 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 Содержимое:

rss