Когда предпочесть список varargs массиву?
я реализую API и имею метод, который вы передаете список путей, по которым программа считывает ресурсы из
public void importFrom(String... paths) {
}
Я использую varargs, чтобы сделать вызов метода максимально удобным для пользователя, например
obj.importFrom("/foo", "/foo/bar);
является ли это подходящим использованием varargs? Или лучше передать массив?
4 ответов
в вашем случае varargs просто отлично. Вам действительно не нужно сделать массив из путей, которые вы будете импортировать, потому что вы ничего не хотите делать с этими путями, кроме как передать их в importFrom
метод.
функциональность varargs избавляет вас от необходимости явно создавать массив исключительно с целью передачи коллекции значений одноразовому методу, который у вас есть здесь.
кстати, ты can еще передайте массив, если вы хотите
public class VarargsDemo {
public static void f(String... args) {
for (String s: args) {
System.out.println(s);
}
}
public static void main(String[] args) {
String[] english = new String[]{"one", "two", "three"};
f(english);
f("uno", "dos", "tres");
}
}
поскольку поведение одинаково, разница сводится к (возможно, незначительному) вопросу о том, что вы хотите, чтобы сигнатура метода "говорила". Когда вы объявляете метод для принятия явного параметра массива, это почти так же, как если бы вы хотели подчеркнуть, что вы хотите работать с объектом массива, что-то, что было определено вне метода и имеет свое собственное существование и важность вне метода, и тот, в котором, возможно, операции, такие как индексирование материи. При объявлении метода с varargs, как вы говорите, "просто дайте мне кучу предметов".
опять же, это не должно быть правдой; JVM не знает разницы, все он видит-это массив во время выполнения. Многие программисты не будут утруждать себя разборками по поводу намерения подписи метода. С varargs делать вызовы удобно.
вот сказал, главный ограничение из varargs является то, что такой параметр должен быть последний из методов. В вашем случае это не проблема, но в целом это что-то рассмотреть.
поскольку аргументы varargs компилируются в один аргумент массива, вы обычно можете предпочесть varargs, так как это может быть более удобным в некоторых случаях и все еще позволяет передавать массив в других случаях.
public void importFrom(String... paths)
{
}
компилируется в
public void importFrom(String[] paths)
{
}
В качестве альтернативы вы также можете использовать Iterable<String>
чтобы упростить передачу аргументов как коллекции.
ответ зависит от предполагаемого использования вашей функции. Если пользователь обычно знает во время кодирования, какие аргументы он хочет передать,varargs
- Это путь. Если пользователю необходимо определить количество аргументов во время выполнения, аргумент массива облегчит ему (или ей) жизнь.
Я думаю, что другой альтернативой является использование List<String>
. Лично я бы использовал List
если аргументов больше нескольких или аргументы обрабатываются автоматически откуда-то (например, из файла).
Если вы будете писать аргументы вручную в коде, то я предпочел бы использовать varargs, как вы предложили.