Я боюсь 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ов за один вызов:
В приведенном выше коде метод add() определен как add(JComponent... components).
Наконец, реализация таких методов должна учитывать тот факт, что они могут вызываться с пустым vararg! Если вы хотите ввести хотя бы один аргумент, вам придется использовать уродливый трюк, такой как:
voidf(T arg1, T... args) {...}
Я считаю этот трюк некрасивым, потому что реализация метода будет менее простой, чем наличие просто T... args в его списке аргументов.
Надеюсь, это поможет прояснить суть varargs.
Ответ 3
Я часто использую varargs для вывода в журналы в целях отладки.
Практически у каждого класса в моем приложении есть метод DebugPrint():
Затем внутри методов класса у меня есть вызовы, подобные следующим:
debugPrint("for assignment ", hwId, ", student ", studentId, ", question ", serialNo, ", the grade is ", grade);
Когда я удовлетворен тем, что мой код работает, я закомментирую код в методе DebugPrint(), чтобы журналы не содержали слишком много посторонней и нежелательной информации, но я могу оставить отдельные вызовы DebugPrint() без комментариев. Позже, если я обнаружу ошибку, я просто раскомментирую код DebugPrint(), и все мои вызовы DebugPrint() будут повторно активированы.
Конечно, я мог бы так же легко отказаться от varargs и вместо этого сделать следующее:
Однако в этом случае, когда я закомментирую код DebugPrint(), серверу все равно приходится сталкиваться с проблемой объединения всех переменных при каждом вызове DebugPrint(), даже если с результирующей строкой ничего не делается. Однако, если я использую varargs, серверу достаточно поместить их в массив, прежде чем он поймет, что они ему не нужны. Экономится много времени.
Ответ 4
Varargs можно использовать, когда мы не уверены в количестве аргументов, которые должны быть переданы в методе. Он создает массив параметров неопределенной длины в фоновом режиме, и такой параметр может обрабатываться как массив во время выполнения.
Если у нас есть метод, который перегружен для приема разного количества параметров, то вместо того, чтобы перегружать метод в разное время, мы можем просто использовать концепцию varargs .
Также, когда тип параметров будет меняться, использование "Object ... test" значительно упростит код.
Например:
publicintcalculate(int...list) { intsum=0; for (int item : list) { sum += item; } return sum; }
Здесь в качестве параметра косвенно передается массив типа int (list), который в коде обрабатывается как массив.
P.S: Даже я боялся использовать varargs, когда не знал об этом. Но теперь я привык к этому. Как говорится: "Мы цепляемся за известное, боимся неизвестного", так что просто используйте это как можно чаще, и вам это тоже начнет нравиться :)