Вопрос-ответ

When do you use varargs in Java?

Когда вы используете varargs в Java?

Я боюсь varargs. Я не знаю, для чего их использовать.

Кроме того, кажется опасным позволять людям передавать столько аргументов, сколько они хотят.

Какой пример контекста, в котором их было бы удобно использовать?

Переведено автоматически
Ответ 1

Varargs полезны для любого метода, которому необходимо иметь дело с неопределенным количеством объектов. Один хороший пример: String.format. Строка формата может принимать любое количество параметров, поэтому вам нужен механизм для передачи любого количества объектов.

String.format("This is an integer: %d", myInt);
String.format("This is an integer: %d and a string: %s", myInt, myString);
Ответ 2

Хорошим практическим правилом было бы:

"Используйте varargs для любого метода (или конструктора), которому требуется массив T (независимо от типа T) в качестве входных данных".

Это упростит вызовы этих методов (нет необходимости делать new T[]{...}).

Вы могли бы расширить это правило, чтобы включить методы с List<T> аргументом, при условии, что этот аргумент предназначен только для ввода (т. Е. Список не изменяется методом).

Кроме того, я бы воздержался от использования f(Object... args), потому что это ведет к программированию с неясными API.

Что касается примеров, я использовал это в DesignGridLayout, где я могу добавить несколько JComponentов за один вызов:

layout.row().grid(new JLabel("Label")).add(field1, field2, field3);

В приведенном выше коде метод add() определен как add(JComponent... components).

Наконец, реализация таких методов должна учитывать тот факт, что они могут вызываться с пустым vararg! Если вы хотите ввести хотя бы один аргумент, вам придется использовать уродливый трюк, такой как:

void f(T arg1, T... args) {...}

Я считаю этот трюк некрасивым, потому что реализация метода будет менее простой, чем наличие просто T... args в его списке аргументов.

Надеюсь, это поможет прояснить суть varargs.

Ответ 3

Я часто использую varargs для вывода в журналы в целях отладки.

Практически у каждого класса в моем приложении есть метод DebugPrint():

private void debugPrint(Object... msg) {
for (Object item : msg) System.out.print(item);
System.out.println();
}

Затем внутри методов класса у меня есть вызовы, подобные следующим:

debugPrint("for assignment ", hwId, ", student ", studentId, ", question ",
serialNo, ", the grade is ", grade);

Когда я удовлетворен тем, что мой код работает, я закомментирую код в методе DebugPrint(), чтобы журналы не содержали слишком много посторонней и нежелательной информации, но я могу оставить отдельные вызовы DebugPrint() без комментариев. Позже, если я обнаружу ошибку, я просто раскомментирую код DebugPrint(), и все мои вызовы DebugPrint() будут повторно активированы.

Конечно, я мог бы так же легко отказаться от varargs и вместо этого сделать следующее:

private void debugPrint(String msg) {
System.out.println(msg);
}

debugPrint("for assignment " + hwId + ", student " + studentId + ", question "
+ serialNo + ", the grade is " + grade);

Однако в этом случае, когда я закомментирую код DebugPrint(), серверу все равно приходится сталкиваться с проблемой объединения всех переменных при каждом вызове DebugPrint(), даже если с результирующей строкой ничего не делается. Однако, если я использую varargs, серверу достаточно поместить их в массив, прежде чем он поймет, что они ему не нужны. Экономится много времени.

Ответ 4

Varargs можно использовать, когда мы не уверены в количестве аргументов, которые должны быть переданы в методе. Он создает массив параметров неопределенной длины в фоновом режиме, и такой параметр может обрабатываться как массив во время выполнения.

Если у нас есть метод, который перегружен для приема разного количества параметров, то вместо того, чтобы перегружать метод в разное время, мы можем просто использовать концепцию varargs .

Также, когда тип параметров будет меняться, использование "Object ... test" значительно упростит код.

Например:

public int calculate(int...list) {
int sum = 0;
for (int item : list) {
sum += item;
}
return sum;
}

Здесь в качестве параметра косвенно передается массив типа int (list), который в коде обрабатывается как массив.

Для лучшего понимания перейдите по этой ссылке (это очень помогло мне четко понять эту концепцию): http://www.javadb.com/using-varargs-in-java

P.S: Даже я боялся использовать varargs, когда не знал об этом. Но теперь я привык к этому. Как говорится: "Мы цепляемся за известное, боимся неизвестного", так что просто используйте это как можно чаще, и вам это тоже начнет нравиться :)

java