Varargs в Java

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.