Переменное число аргументов в Java

В ряде случаев точное количество передаваемых аргументов методу заранее неизвестно. Такое может случится во время написания метода регистрации пользователя. Всегда существует ряд необязательных полей, которые пользователь может не ввести: пол, дату рождения и т. п. Программисту на Java справиться с данной проблемой поможет переменное число аргументов.

Конечно, существуют альтернативные пути решения проблемы, изложенной выше – их обычно и использовали до появления аргументов переменной длины (появились в JDK версии 5). Например, можно создать несколько перегруженных методов, охватывающих все ситуации, но данный способ не применим, когда максимальное количество аргументов велико. Другой способ – это передавать аргументы метода в виде массива элементов. Оба данных приёма не идеальны и не применимы в ряде случаев.

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

Для того, чтобы задать переменное число аргументов в методе на языке Java используется оператор многоточие (). Например, если необходимо задать в методе аргумент переменной длины типа double, то нужно использовать следующую конструкцию:

Работа с аргументом переменной длины производится аналогично работе с массивом.

Чтобы узнать количество аргументов, переданных методу, необходимо воспользоваться свойством:

Получение значения, например, второго аргумента производится так (нумерация начинается с нуля):

Следует отдельно отметить, что в сигнатуре метода возможно использовать максимум только один аргумент переменной длины! Иначе возникнет ошибка.

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

Методы с аргументами переменной длины можно перегружать.

Рассмотрим всё вышесказанное на примере Java-программы.

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

Продемонстрируем работу с переменным числом аргументов. Напишем класс VariableLengthArgument с методом printArgument1:

Данный метод выводит строку с информацией о количестве полученных аргументов и затем выводит в консоль сами аргументы.

В методе main главного класса программы создадим объект VariableLengthArgument и вызовем его метод с разными параметрами.

Из примера видно, что вызывать метод без параметров также допустимо.

Запустим программу. Результат выполнения представлен на скриншоте ниже.

Переменное число аргументов в Java

Продемонстрируем использование в сигнатуре метода, как обычных аргументов, так и переменного числа аргументов. Для этого добавим в класс VariableLengthArgument ещё один метод:

Вызовем его.

Выполним программу. Результат работы:

Обычные аргументы и переменное число аргументов Java

Далее покажем возможность перегрузки методов с аргументами переменной длины. Добавим в класс ещё три метода.

Выполним их.

Демонстрация работы перегруженных методов:

Перегрузка методов с аргументами переменной длины

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

Используя переменное число аргументов, можно столкнуться с ситуацией неоднозначности при вызове метода. Рассмотрим пример:

При компиляции возникнет ошибка.

Действительно, нельзя однозначно сказать к какому методу относится данный вызов: к первой или третьей версии метода printArgument3. Они оба могут принимать ноль аргументов.

Ещё одна ситуация неоднозначности:

Под текущий вызов подпадает вторая и третья версия метода printArgument3. Соответственно программа не будет скомпилирована.

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

Переменное число аргументов в Java
5 (100%) 1 vote

Поделиться в соц. сетях:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">