Переменное число аргументов методов языка Java

Переменное число аргументов методов языка JavaИногда оказываются полезными методы, способные принимать переменное чис­ло аргументов.

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

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

До версии J2SE5 для поддержки списков аргументов переменной длины применя­лись два способа, ни один из которых не был особенно удобен.

Во-первых, если макси­мально возможное количество аргументов было невелико и заранее известно, то можно было создавать перегруженные версии метода — по одной для каждого способа его вы­зова. Очевидно, что такой подход применим лишь в отдельных случаях.

И во-вторых, если таких версий требовалось создавать слишком много или их максимальное коли­чество было неопределенным, то применялся второй подход: параметры помещались в массив, а затем этот массив передавался методу.

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

Такое решение было предложено в JDK 5. Новое средство, которое позволило изба­виться от явного формирования массива аргументов перед вызовом метода, получило название varargs (сокращение от variable-length arguments — список аргументов перемен­ной длины).

Соответствующие методы называют методами с переменным числом аргу­ментов (другое название — методы переменной арности). В методах этого типа список параметров имеет не фиксированную, а переменную длину, что обеспечивает дополни­тельную гибкость, позволяя методам принимать произвольное число аргументов.

Пользуюсь случаем, хочу спросить аудиторию: работали ли вы когда-то с WordPress-ом? Очень нужен шаблон ThemeForest Motors, уж очень сильно он подойдет для одного моего проекта. Могу отблагодарить материально.

Использование методов с переменным числом аргументов

Списки аргументов переменной длины обозначаются символом многоточия ( … ). Ниже приведен пример метода vaTest(), принимающего переменное число аргументов(в том числе и нулевое).

Обратите внимание на синтаксис объявления параметра v:

Это объявление сообщает компилятору, что метод vaTest() может вызываться с ука­занием произвольного количества аргументов, в том числе и вовсе без них.

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

Ниже приведен полный исходный код примера программы, которая демонстрирует использование метода vaTest().

Выполнение этой программы дает следующий результат.

В приведенной выше программе обращает на себя внимание следующее.

Во-первых, как пояснялось выше, обращение к параметру v в методе vaTest() осуществляется как к массиву. Дело в том, что он действительно является массивом (и, таким образом, может иметь переменную длину).

Многоточие в объявлении этого метода указывает компиля­тору на использование переменного числа аргументов, а также на необходимость поме­стить их в массив v.

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

Помимо списка параметров переменной длины, в объявлении метода могут указы­ваться и обычные параметры, но при одном условии: массив параметров переменной длины должен быть указан последним. Например, приведенное ниже объявление мето­да является вполне допустимым.

В этом случае первым трем аргументам, указанным при вызове метода doIt(), будут соответствовать первые три параметра в объявлении метода, тогда как остальные аргу­менты будут приниматься из массива vals.

Ниже приведен переработанный вариант метода vaTest(), в котором метод получает как обычные аргументы, так и массив аргументов переменной длины.

Выполнение этого фрагмента кода дает следующий результат.

Помните о том, что список параметров переменной длины должен указываться по­следним. Например, следующее объявление метода недопустимо.

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

Существует еще одно ограничение, которое следует соблюдать: список параметров переменной длины можно указать в методе только один раз. Например, приведенное ниже объявление метода недопустимо.

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

Интересное видео для читателей нашего блога о Java: