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

GNU datamash - полезный инструмент для расчета такого рода вещей:

$ datamash -sHt, groupby 2 mean 3 < employees.txt

Объедините с grep, чтобы ограничить его только названием, которое вас интересует. [ 114]

190
задан Harry Quince 19 April 2009 в 13:54
поделиться

4 ответа

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

String.format("This is an integer: %d", myInt);
String.format("This is an integer: %d and a string: %s", myInt, myString);
150
ответ дан 23 November 2019 в 05:37
поделиться

Я часто использую varargs для конструкторов, которые могут принимать какой-то объект фильтра. Например, большая часть нашей системы, основанная на Hadoop, основана на Mapper, который обрабатывает сериализацию и десериализацию элементов в JSON и применяет несколько процессоров, каждый из которых принимает элемент содержимого и либо изменяет и возвращает его, либо возвращает ноль. отклонить.

1
ответ дан 23 November 2019 в 05:37
поделиться
/* Jeez, this is an ugly mess */

...comment from the X11R6 internals source code circa 1991.
компоненты) .

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

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

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

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

78
ответ дан 23 November 2019 в 05:37
поделиться

У меня тоже есть страх, связанный с varargs:

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

Если вам нужно сохранить этот массив внутри, вы можете сначала его клонировать, чтобы избежать возможности вызывающей стороны изменить его позже.

 Object[] args = new Object[] { 1, 2, 3} ;

 varArgMethod(args);  // not varArgMethod(1,2,3);

 args[2] = "something else";  // this could have unexpected side-effects

Хотя это не сильно отличается от передачи какого-либо объекта, состояние которого может измениться. позже, поскольку массив обычно (в случае вызова с несколькими аргументами вместо массива) является новым, созданным компилятором внутри, который вы можете безопасно использовать, это, безусловно, неожиданное поведение.

5
ответ дан 23 November 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: