Когда предпочесть список 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, как вы предложили.