Чтение онлайн

на главную - закладки

Жанры

Java: руководство для начинающих
Шрифт:

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

Раньше для поддержки переменного числа аргументов применялись два способа, причем оба были далеки от совершенства. Первый способ состоял в следующем: если максимальное число аргументов невелико и известно заранее, то можно создать разные варианты одного метода. Очевидно, что такой подход применим лишь в отдельных случаях. Если же значений оказывалось слишком много или их максимальное количество не было известно заранее, то применялся второй способ: параметры помещались в массив, который и передавался методу. Обоим этим способам присущи определенные недостатки, и со временем стало ясно, что требуется какой-то другой, более совершенный подход к решению данной задачи.

В версии JDK 5 появились языковые средства Java, упрощающие создание методов, которым требуется переменное число аргументов. Эти средства называются аргументами переменной длины, а метод, принимающий переменное число аргументов,— методом переменной арности, или же методом с аргументами переменной длины. Список параметров, соответствующих аргументам переменной длины, имеет не фиксированную, а переменную длину. Поэтому метод с аргументами переменной длины может принимать произвольно изменяющееся число аргументов. Общие положения об аргументах переменной длины

Для указания на то, что метод может принимать переменное число аргументов, в его объявление включается многоточие (...)• Ниже приведен пример метода vaTest , принимающего переменное число аргументов. // Метод vaTest с аргументами переменной длины. // Объявление списка аргументов переменной длины. static void vaTest(int ... v) { System.out.println("Number of args: " + v.length); System.out.println("Contents: "); for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println; }

Обратите внимание на следующий синтаксис объявления аргумента v: int ... v

Этот синтаксис сообщает компилятору, что метод vaTest может вызываться с указанием произвольного числа аргументов, в том числе и совсем без них. Более того, аргумент v неявно объявляется как массив типа int [ ]. А в теле метода vaTest доступ к аргументу v осуществляется с помощью обычного синтаксиса обращения к массивам.

Ниже приведен весь исходный код примера программы, демонстрирующего метод vaTest в действии. // Демонстрация метода с аргументами переменной длины, class VarArgs { // Метод vaTest с аргументами переменной длины, static void vaTest(int ... v) { System.out.println("Number of args: " + v.length); System.out.println("Contents: ") ; for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println; } public static void main(String args[]) { // Метод vaTest может вызываться с переменным числом аргументов. vaTest(10); // 1 аргумент vaTest(l, 2, 3); // 3 аргумента vaTest; // без аргументов } }

Выполнение этой программы дает следующий результат: Number of args: 1 Contents: arg 0: 10 Number of args: 3 Contents: arg 0: 1 arg 1: 2 arg 2: 3 Number of args: 0 Contents:

В приведенной выше программе обращает на себя внимание следующее. Во-первых, как пояснялось выше, обращение к аргументу v в методе vaTest осуществляется как к массиву. Дело в том, что он действительно является массивом. Многоточие в объявлении этого метода указывает компилятору на использование переменного числа аргументов и на необходимость поместить их в массив v. Во-вторых, при обращении к методу vaTest в методе main указывается разное число аргументов, включая и вызов данного метода вообще без аргументов. Указываемые аргументы автоматически помещаются в массив v. Если же аргументы не указаны, длина этого массива будет равна нулю.

Помимо аргумента переменной длины, в методе можно также указывать и обычные аргументы, но при одном условии: аргумент переменной длины должен быть указан последним. Например, приведенное ниже объявление метода является вполне допустимым, int dolt(int a, int b, double с, int ... vals) {

В данном случае первые три аргумента, передаваемые при вызове метода dolt , будут соответствовать первым трем параметрам. А остальные аргументы будут считаться относящимися к параметру переменной длины vals.

Ниже приведен переработанный вариант метода vaTest , в котором используются как обычные аргументы, так и аргументы переменной длины. // Использование аргументов переменной длины // вместе с обычными аргументами, class VarArgs2 { // Здесь msg - обычный аргумент, // a v - аргумент переменной длины. static void vaTest(String msg, int ... v) { System.out.println(msg + v.length); System.out.println("Contents: ") ; for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println; } public static void main(String args[]) { vaTest("One vararg: ", 10); vaTest ("Three varargs: ", 1, 2, 3); vaTest("No varargs: "); } }

Выполнение этого фрагмента кода дает следующий результат: One vararg: 1 Contents: arg 0: 10 Three varargs: 3 Contents: arg 0: 1 arg 1: 2 arg 2: 3 No varargs: 0 Contents:

He следует, однако, забывать, что аргумент переменной длины должен быть указан последним. Например, следующее объявление метода недопустимо: int dolt(int a, int b, double с, int ... vals, boolean stopFlag) { // Ошибка!

В данном примере сделана попытка указать обычный аргумент после аргумента переменной длины.

Существует еще одно ограничение, которое следует соблюдать: аргументы переменной длины можно указать в методе только один раз. Например, приведенное ниже объявление метода составлено неверно. int dolt(int a, int b, double с, int ... vals, double ... morevals) { // Ошибка!

Ошибкой в данном случае является попытка указать два разных типа аргументов переменной длины. Перегрузка методов с аргументами переменной длины

Если требуется, то метод, принимающий переменное число аргументов, можно перегрузить. Например, в следующей программе трижды перегружается метод vaTest : // Перегрузка метода с аргументами переменной длины, class VarArgs3 { // Первый вариант метода vaTest. static void vaTest(int ... v) { System.out.println("vaTest (int ...): " + "Number of args: " + v.length); System.out.println("Contents: ") ; for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println; } // Второй вариант метода vaTest. static void vaTest(boolean ... v) { System.out.println("vaTest(boolean ...): " + "Number of args: " + v.length); System.out.println("Contents: ") ; for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println; } // Третий вариант метода vaTest. static void vaTest(String msg, int ... v) { System.out.println("vaTest(String, int ...): " + msg + v.length); System.out.println("Contents: ") ; for (int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println; } public static void main(String args[]) { vaTest(1, 2, 3) ; vaTest("Testing: ", 10, 20); vaTest(true, false, false); } }

Поделиться:
Популярные книги

Черный маг императора

Герда Александр
1. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора

Брак по-драконьи

Ардова Алиса
Фантастика:
фэнтези
8.60
рейтинг книги
Брак по-драконьи

Наследник

Шимохин Дмитрий
1. Старицкий
Приключения:
исторические приключения
5.00
рейтинг книги
Наследник

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Варяг

Мазин Александр Владимирович
1. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Варяг

Горизонт Вечности

Вайс Александр
11. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Горизонт Вечности

Звездная Кровь. Экзарх III

Рокотов Алексей
3. Экзарх
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Экзарх III

Законы рода

Мельник Андрей
1. Граф Берестьев
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Законы рода

На границе империй. Том 10. Часть 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 6

Хозяин теней 2

Демина Карина
2. Громов
Фантастика:
аниме
попаданцы
фэнтези
7.00
рейтинг книги
Хозяин теней 2

Избрание сочинения в трех томах. Том второй

Кочетов Всеволод Анисимович
Проза:
советская классическая проза
5.00
рейтинг книги
Избрание сочинения в трех томах. Том второй

Изгои

Владимиров Денис
5. Глэрд
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Изгои

Бастард рода Неллеров. Книга 1

Усов Серг
1. Бастард рода Неллеров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Бастард рода Неллеров. Книга 1

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель