什么时候更喜欢varargs列表到数组?

我正在实现一个API,它有一个方法可以传递程序从中读取资源的路径列表

public void importFrom(String... paths) { } 

我正在使用varargs来尽可能方便地调用方法给用户,就像这样

 obj.importFrom("/foo", "/foo/bar); 

这是varargs的合适用法吗? 或者更好地传递数组?

在你的情况下varargs就好了。 您实际上并不需要创建要导入的路径数组,因为除了将它们传递给importFrom方法之外,您不想对这些路径执行任何操作。

varargsfunction使您不必显式创建一个数组,仅仅是为了将一组值传递给一次性方法,您可以在这里看到它。

顺便说一句,如果你愿意,你仍然可以传入一个数组

 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来更容易地将参数作为集合传递。

答案取决于您的function的预期用途。 如果用户通常在编码时知道他想要传入哪些参数,那么varargs就是最佳选择。 如果用户需要能够在运行时确定参数的数量,那么数组参数将使他(或她)的生活变得更加容易。

我认为另一种选择是使用List 。 我个人会使用List如果有多个参数或者从某个地方自动处理参数(例如从文件解析)。

如果您将在代码中手动编写参数,那么我更倾向于使用您提出的varargs。