我正在实现一个API,它有一个方法,你可以传递一个路径列表,程序从其中读取资源
public void importFrom(String... paths) { }
字符串我使用varargs使调用方法尽可能方便用户,如下所示
obj.importFrom("/foo", "/foo/bar);
型这是一种对varargs的恰当使用吗?还是传入一个数组更好?
oipij1gg1#
在你的例子中,varargs就很好了,你不需要为你要导入的路径创建一个数组,因为除了将它们沿着传递给你的importFrom方法之外,你不想对这些路径做任何事情。varargs功能使您不必仅为了将值集合传递给一次性方法而显式创建数组,而您在这里似乎确实拥有这种方法。顺便说一句,如果你想,你仍然可以传入一个数组
importFrom
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的主要 * 限制 * 是这样的参数必须是方法的最后一个。在你的情况下,这不是一个问题,但一般来说,这是需要考虑的。
lh80um4z2#
由于varargs参数被编译成一个数组参数,你通常会更喜欢varargs,因为这在某些情况下可能更方便,在其他情况下仍然允许传递数组。
字符串编译成
public void importFrom(String[] paths) { }
型或者,您也可以使用Iterable<String>来更容易地将参数作为集合传递。
Iterable<String>
wnrlj8wa3#
答案取决于你的函数的预期用途。如果用户通常在编码时就知道他想要传入哪些参数,varargs是最好的选择。如果用户需要能够在运行时确定参数的数量,数组参数将使他(或她)的生活变得更容易。
varargs
63lcw9qa4#
我认为另一种选择是使用List<String>。如果有多个参数,或者参数是从某个地方自动处理的(例如从文件解析),我个人会使用List。如果你将在代码中手动编写参数,那么我更喜欢使用你建议的varargs。
List<String>
List
piztneat5#
你的方法可以接受list或varargs。这里有一个关于为什么varargs存在的历史,假设你有多个数据和一个接受列表的方法:
String a = "hello"; int b = 50; public void printData(List<Object> objects) { for (Object object : objects) { System.out.println(object.toString()); } }
字符串然后,为了将数据传递给printData()方法,您需要从数据创建一个数组,然后将其传递给该方法。但是使用varargs,您不再需要这样做。从文档(https://docs.oracle.com/javase/8/docs/technotes/guides/language/varargs.html):数组中必须传递多个参数仍然是正确的,但是varargs特性自动化并隐藏了这个过程。
5条答案
按热度按时间oipij1gg1#
在你的例子中,varargs就很好了,你不需要为你要导入的路径创建一个数组,因为除了将它们沿着传递给你的
importFrom
方法之外,你不想对这些路径做任何事情。varargs功能使您不必仅为了将值集合传递给一次性方法而显式创建数组,而您在这里似乎确实拥有这种方法。
顺便说一句,如果你想,你仍然可以传入一个数组
字符串
因为行为是相同的,所以差异归结为当你声明一个方法接受一个显式的数组参数时,几乎就像你想强调你想对一个数组对象进行操作,这个对象已经在方法之外定义了,并且在方法之外有自己的存在和重要性,并且其中,也许,像索引这样的操作很重要。当用varargs声明方法时,就好像你在说“给我给予一堆项”。
不过,这也不一定是真的; JVM不知道其中的区别,它在运行时看到的只是一个数组。许多程序员不会费心去分析方法签名的意图。Varargs就是为了方便调用。
也就是说,varargs的主要 * 限制 * 是这样的参数必须是方法的最后一个。在你的情况下,这不是一个问题,但一般来说,这是需要考虑的。
lh80um4z2#
由于varargs参数被编译成一个数组参数,你通常会更喜欢varargs,因为这在某些情况下可能更方便,在其他情况下仍然允许传递数组。
字符串
编译成
型
或者,您也可以使用
Iterable<String>
来更容易地将参数作为集合传递。wnrlj8wa3#
答案取决于你的函数的预期用途。如果用户通常在编码时就知道他想要传入哪些参数,
varargs
是最好的选择。如果用户需要能够在运行时确定参数的数量,数组参数将使他(或她)的生活变得更容易。63lcw9qa4#
我认为另一种选择是使用
List<String>
。如果有多个参数,或者参数是从某个地方自动处理的(例如从文件解析),我个人会使用List
。如果你将在代码中手动编写参数,那么我更喜欢使用你建议的varargs。
piztneat5#
你的方法可以接受list或varargs。
这里有一个关于为什么varargs存在的历史,假设你有多个数据和一个接受列表的方法:
字符串
然后,为了将数据传递给printData()方法,您需要从数据创建一个数组,然后将其传递给该方法。但是使用varargs,您不再需要这样做。
从文档(https://docs.oracle.com/javase/8/docs/technotes/guides/language/varargs.html):
数组中必须传递多个参数仍然是正确的,但是varargs特性自动化并隐藏了这个过程。