Varargs в Java
1. Вступление
Varargs были введены вJava 5 и представляют собой сокращение для методов, которые поддерживают произвольное количество параметров одного типа.
В этой статье мы увидим, как можно использовать эту основную функцию Java.
2. ДоVarargs
До Java 5 всякий раз, когда мы хотели передать произвольное количество аргументов, нам приходилось передавать все аргументы в массиве или реализовывать N методов (по одному для каждого дополнительного параметра):
public String format() { ... }
public String format(String value) { ... }
public String format(String val1, String val2) { ... }
3. ИспользованиеVarargs
Varargs помогает нам избежать написания шаблонного кода, вводя новый синтаксис, который может автоматически обрабатывать произвольное количество параметров - используя скрытый массив.
Мы можем определить их, используя стандартное объявление типа, за которым следует многоточие:
public String formatWithVarArgs(String... values) {
// ...
}
И теперь мы можем вызвать наш метод с произвольным числом аргументов, например:
formatWithVarArgs();
formatWithVarArgs("a", "b", "c", "d");
Как упоминалось ранее,varargs are arrays so we need to work with them just like we’d work with a normal array.
4. правила
Varargs просты в использовании. Но нужно помнить о нескольких правилах:
-
Каждый метод может иметь только один параметрvarargs
-
Аргументvarargs должен быть последним параметром
5. Безопасное использование вараргов
Использованиеvarargs может привести к так называемомуHeap Pollution.
Проще говоря, это означает, что Java обрабатываетvarargs как общие экземплярыObject, что в дальнейшем может привести кClassCastExceptions.
Это не означает, чтоvarargs небезопасны. Это безопасно при работе с конкретным типом, напримерString, но использование дженериков может быть не так просто.
Поскольку существует потенциальный риск фатального исключения во время выполнения, компилятор Java или наша IDE могут показать предупреждение, подобное этому:
warning: [varargs] Possible heap pollution from parameterized vararg type T
Если мы гарантируем, что сам метод не выполняет никаких злонамеренных преобразований или приведений типов, мы можем использовать@SafeVarargs для подавления предупреждения.
6. Заключение
Varargs может избавить Java от многих шаблонов.
И, благодаря их неявнымautoboxing к и отArray,, они играют роль в будущей проверке нашего кода.
Как всегда, все примеры кода из этой статьи доступны в нашихGitHub repository.