Varargs — специальный синтаксис позволяющий методу принимать переменное (любое) количество аргументов одного типа. В объявлении метода такой параметр обозначается как Type... name (например, int... nums). Внутри метода аргументы воспринимаются как обычный массив.
Пример:
public void printNumbers(int... nums) { for (int n : nums) { System.out.print(n + " "); } }
Вызывать можно так:
printNumbers(1, 2, 3, 4); // или printNumbers();
Внутренняя реализация: при вызове метода с varargs компилятор автоматически создаёт массив соответствующего типа.
Ограничения и тонкости:
printNumbers(null) вызовет NPE при попытке перебора.Вопрос: "Можно ли объявить метод с несколькими varargs-параметрами?"
Часто ошибаются: многие думают, что можно объявить public void example(int... a, String... b), но это вызовет ошибку компиляции.
Верный ответ: Нет, возможно только один varargs-параметр, и он должен быть последним.
История
В корпоративной библиотеке логирования реализовали перегруженные версии методов с varargs и массивами. При передаче массива вместо набора элементов применён был не тот вариант метода, из-за чего массив логировался как объект, а не его содержимое. Это вызвало путаницу при анализе логов.
История
В интеграционном сервисе вызов метода с varargs принимал null, не проверяя на NPE. Система неожиданно "падала" при попытке переборки элементов, так как ожидался как минимум пустой массив.
История
В одном e-commerce проекте запутались в перегрузках методов: был метод
send(String subject, String... emails)и другой —send(String subject, String[] emails). При передаче массива компилятор неявно выбирал не тот метод. Итог: письма не отправлялись клиентам.