java 什么时候更喜欢varargs列表而不是数组?

w8ntj3qf  于 12个月前  发布在  Java
关注(0)|答案(5)|浏览(86)

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

public void importFrom(String... paths) {

}

字符串
我使用varargs使调用方法尽可能方便用户,如下所示

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


这是一种对varargs的恰当使用吗?还是传入一个数组更好?

oipij1gg

oipij1gg1#

在你的例子中,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的主要 * 限制 * 是这样的参数必须是方法的最后一个。在你的情况下,这不是一个问题,但一般来说,这是需要考虑的。

lh80um4z

lh80um4z2#

由于varargs参数被编译成一个数组参数,你通常会更喜欢varargs,因为这在某些情况下可能更方便,在其他情况下仍然允许传递数组。

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

字符串
编译成

public void importFrom(String[] paths)
{
}


或者,您也可以使用Iterable<String>来更容易地将参数作为集合传递。

wnrlj8wa

wnrlj8wa3#

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

63lcw9qa

63lcw9qa4#

我认为另一种选择是使用List<String>。如果有多个参数,或者参数是从某个地方自动处理的(例如从文件解析),我个人会使用List
如果你将在代码中手动编写参数,那么我更喜欢使用你建议的varargs。

piztneat

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特性自动化并隐藏了这个过程。

相关问题