VarArgs в Java
Данная статья:
- написана командой Vertex Academy.
- это одна из статей из нашего "Самоучителя по Java"
Привет! Это статья про VarArgs в Java.
Что такое VarArgs
Наверняка, если Вы читаете эту статью, Вы уже написали не один метод и даже не десять. И, конечно, Вам известно, что для каждого метода мы задаем типы параметров, которые требуются для работы метода. Например:
void myMethod(String s)
требует для работы одну переменную типа String, или
int findMax(int a, int b)
просит две переменные типа int.
Тем не менее, в Java есть еще одна "специальная" возможность работы с аргументами. Давайте приведем пример.
Представим, что нам нужно создать метод, который складывает переменные типа int.
Назовем этот метод addAll(). Сначала представим, что у нас два аргумента. Пишем такой код:
1 2 3 4 5 6 7 8 |
class MyClass { public int addAll(int firstNumber, int secondNumber) { return firstNumber + secondNumber; } } |
Отлично! А что если мы хотим получить сумму трех чисел? Добавим еще один метод, только уже с тремя аргументами:
1 2 3 4 5 6 7 8 9 10 |
class MyClass { public int addAll(int firstNumber, int secondNumber) { return firstNumber + secondNumber; } public int addAll(int firstNumber, int secondNumber, int thirdNumber) { return firstNumber + secondNumber + thirdNumber; } } |
Замечательно. И запустим:
1 2 3 4 5 6 7 8 9 |
public class Test { public static void main(String[] args) { MyClass obj = new MyClass(); System.out.println(obj.addAll(1,2)); System.out.println(obj.addAll(1,2,3)); } } |
Получим корректный результат:
Но а что, если мы хотим сложить четыре int-а? Пять int-ов? Шесть int-ов?.. Что, писать для каждого свой метод? Нет, это не выход. Именно тут нам и поможет VarArgs.
VarArgs переводится как Variable Arguments List - что-то типа "список аргументов переменной длины", или "список переменной длины, в которой лежат аргументы":
Итак, вместо того, чтобы задавать конкретное количество аргументов - два, три, четыре - мы можем сказать Java, что мы не знаем, сколько их будет 🙂 Но метод все равно сработает, и будет иметь доступ ко всем заданным аргументам. Давайте перепишем наш метод, используя VarArgs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class MyClass { public int addAll(int ... numbers) { int sum = 0; for (int i = 0; i < numbers.length ; i++) { sum = sum + numbers[i]; System.out.println("Adding " + numbers[i] + ": get " + sum); } return sum; } } |
Как видите, для наглядности мы добавили еще и вывод в консоль.
Теперь если запустить тот же main, все сработает корректно:
1 2 3 4 5 6 7 8 9 |
public class Test { public static void main(String[] args) { MyClass obj = new MyClass(); System.out.println(obj.addAll(1,2)); System.out.println(obj.addAll(1,2,3)); } } |
Получаем:
Заметьте - у нас всего один метод вместо двух, но он принимает и да, и три аргумента. Если мы напишем десять аргументов, он тоже отработает корректно:
1 2 3 4 5 6 7 8 |
public class Test { public static void main(String[] args) { MyClass obj = new MyClass(); System.out.println(obj.addAll(1,1,1,1,1,1,1,1,1,1)); } } |
Получаем:
Отлично! Теперь давайте рассмотрим VarArgs чуть-чуть ближе.
Синтаксис VarArgs
Как Вы могли заметить, переменная VarArgs очень похожа на обычную, только между типом и названием ставятся три точки:
Естественно, тип может быть любым - String, long, float и т.д.
Кроме того, возможна и такая запись:
1 2 3 4 5 6 7 |
class MyClass { public void myVarArgs(String s, int... var) { // ... } } |
Т.е. кроме аргумента VarArgs можно передавать и другие аргументы. Но обратите внимание, что аргумент VarArgs должен стоять последним в списке аргументов, то есть после него не может быть ни одного аргумента, но перед ним сколько угодно 🙂
Другие особенности
И напоследок обратим Ваше внимание еще на несколько моментов.
Внутри метода мы работаем с VarArgs как с массивом
Возможно Вы заметили, что в нашем примере мы обращались к элементам VarArgs по индексу, и узнавали длину с помощью .length.
А если ноль аргументов - VarArgs тоже будет работать?
Давайте попробуем не передать ни одного аргумента в метод с VarArgs. Напишем следующий код:
1 2 3 4 5 6 7 8 |
public class Test { public static void main(String[] args) { MyClass obj = new MyClass(); System.out.println(obj.addAll()); } } |
Что мы получим в консоли? Видим следующее:
Отлично! Мы не видим сообщений об ошибке, метод отработаю корректно. Это значит, что мы можем задавать от нуля до... бесконечности аргументов в VarArgs 🙂
Надеемся, что наша статья была Вам полезна. Можно записаться к нам на курсы по Java на сайте.