我正在实现一个API,它有一个方法可以传递程序从中读取资源的路径列表
public void importFrom(String... paths) {
}
我正在使用varargs向用户调用方法尽可能方便,如此
obj.importFrom("/foo", "/foo/bar);
这是否适合使用varargs?或者更好地传递数组?
答案 0 :(得分:8)
在你的情况下,varargs就好了。您实际上并不需要创建要导入的路径数组,因为除了将它们传递给importFrom
方法之外,您不想对这些路径执行任何操作。
varargs功能使您不必显式创建一个数组,仅仅是为了将一组值传递给一次性方法,而这似乎就在这里。
顺便说一下,如果你想
,你可以仍然传入一个数组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的主要限制是这样的参数必须是方法的最后一个。在你的情况下,这不是问题,但通常需要考虑。
答案 1 :(得分:3)
由于varargs参数被编译成单个数组参数,你通常更喜欢varargs,因为在某些情况下这可能更方便,并且在其他情况下仍允许传递数组。
public void importFrom(String... paths)
{
}
编译成
public void importFrom(String[] paths)
{
}
或者你也可以使用Iterable<String>
来更容易地将参数作为集合传递。
答案 2 :(得分:2)
答案取决于您的功能的预期用途。如果用户通常在编码时知道他想要传递哪些参数,那么varargs
就是最佳选择。如果用户需要能够在运行时确定参数的数量,那么数组参数将使他(或她)的生活变得更加容易。
答案 3 :(得分:1)
我认为另一种选择是使用List<String>
。我个人会使用List
如果有多个参数或者从某个地方自动处理参数(例如从文件解析)。
如果您要在代码中手动编写参数,那么我更倾向于使用您提出的varargs。