В ряде случаев точное количество передаваемых аргументов методу заранее неизвестно. Такое может случится во время написания метода регистрации пользователя. Всегда существует ряд необязательных полей, которые пользователь может не ввести: пол, дату рождения и т. п. Программисту на Java справиться с данной проблемой поможет переменное число аргументов.
Конечно, существуют альтернативные пути решения проблемы, изложенной выше — их обычно и использовали до появления аргументов переменной длины (появились в JDK версии 5). Например, можно создать несколько перегруженных методов, охватывающих все ситуации, но данный способ не применим, когда максимальное количество аргументов велико. Другой способ — это передавать аргументы метода в виде массива элементов. Оба данных приёма не идеальны и не применимы в ряде случаев.
Определение метода с переменным числом аргументов
Для того, чтобы задать переменное число аргументов в методе на языке Java используется оператор многоточие (…). Например, если необходимо задать в методе аргумент переменной длины типа double, то нужно использовать следующую конструкцию:
1 2 3 |
public void testMethod(double ... d) { //код метода } |
Работа с аргументом переменной длины производится аналогично работе с массивом.
Чтобы узнать количество аргументов, переданных методу, необходимо воспользоваться свойством:
1 |
d.length |
Получение значения, например, второго аргумента производится так (нумерация начинается с нуля):
1 |
d[1] |
Следует отдельно отметить, что в сигнатуре метода возможно использовать максимум только один аргумент переменной длины! Иначе возникнет ошибка.
Аргумент переменной длины можно использовать в сочетании с обычными параметрами, но важно соблюдать условие: аргумент переменной длины должен находится на последнем месте в списке параметров метода, иначе будет выведена ошибка и программа не скомпилируется.
Методы с аргументами переменной длины можно перегружать.
Рассмотрим всё вышесказанное на примере Java-программы.
Переменное число аргументов — пример программы на языке Java
Продемонстрируем работу с переменным числом аргументов. Напишем класс VariableLengthArgument с методом printArgument1:
1 2 3 4 5 6 7 8 9 10 |
public class VariableLengthArgument { public void printArgument1(int ... k) { System.out.println("Количество аргументов: " + k.length); for(int i = 0; i < k.length; i++) { System.out.println(k[i]); } } } |
Данный метод выводит строку с информацией о количестве полученных аргументов и затем выводит в консоль сами аргументы.
В методе main главного класса программы создадим объект VariableLengthArgument и вызовем его метод с разными параметрами.
1 2 3 4 5 6 7 |
public static void main(String[] args) { VariableLengthArgument vla = new VariableLengthArgument(); vla.printArgument1(1); vla.printArgument1(10, 100, 1000); vla.printArgument1(); } |
Из примера видно, что вызывать метод без параметров также допустимо.
Запустим программу. Результат выполнения представлен на скриншоте ниже.
Продемонстрируем использование в сигнатуре метода, как обычных аргументов, так и переменного числа аргументов. Для этого добавим в класс VariableLengthArgument ещё один метод:
1 2 3 4 5 6 7 |
public void printArgument2(String message, int ... k) { System.out.println(message); for(int i = 0; i < k.length; i++) { System.out.println(k[i]); } } |
Вызовем его.
1 |
vla.printArgument2("В метод передано 3 числа", 10, 100, 1000); |
Выполним программу. Результат работы:
Далее покажем возможность перегрузки методов с аргументами переменной длины. Добавим в класс ещё три метода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public void printArgument3(int ... k) { System.out.println("Количество аргументов: " + k.length); for(int i = 0; i < k.length; i++) { System.out.println(k[i]); } } public void printArgument3(String message, int ... k) { System.out.println(message); for(int i = 0; i < k.length; i++) { System.out.println(k[i]); } } public void printArgument3(String ... s) { System.out.println("Количество аргументов: " + s.length); for(int i = 0; i < s.length; i++) { System.out.println(s[i]); } } |
Выполним их.
1 2 3 |
vla.printArgument3(1); vla.printArgument3("В метод передано 3 числа", 10, 100, 1000); vla.printArgument3("Строка 1", "Строка 2"); |
Демонстрация работы перегруженных методов:
Ситуации неоднозначности при использовании переменного числа аргументов
Используя переменное число аргументов, можно столкнуться с ситуацией неоднозначности при вызове метода. Рассмотрим пример:
1 |
vla.printArgument3(); //ошибка |
При компиляции возникнет ошибка.
Действительно, нельзя однозначно сказать к какому методу относится данный вызов: к первой или третьей версии метода printArgument3. Они оба могут принимать ноль аргументов.
Ещё одна ситуация неоднозначности:
1 |
vla.printArgument3("Строка 1"); //ошибка |
Под текущий вызов подпадает вторая и третья версия метода printArgument3. Соответственно программа не будет скомпилирована.
Для решения данной проблемы можно попробовать отказаться от перегрузки методов и создать методы с различающимися именами.
Поделиться в соц. сетях: