何时更喜欢可变参数列表而不是数组?

问题描述 投票:0回答:5

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

public void importFrom(String... paths) {

}

我使用可变参数来使用户尽可能方便地调用该方法,就像这样

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

这是可变参数的适当使用吗?还是传入数组更好?

java variadic-functions
5个回答
10
投票

在你的情况下,可变参数就可以了。您实际上并不需要创建要导入的路径的数组,因为除了将它们传递给您的

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");
    }
}

因为行为是相同的,所以差异归结为一个(可能是次要的)问题,即您希望方法签名“说”什么。当你声明一个方法来接受显式数组参数时,几乎就像你想强调你想要对一个数组对象进行操作,数组对象是在方法外部定义的,并且在方法外部有自己的存在和重要性,并且其中,索引之类的操作也许很重要。当用可变参数声明方法时,就好像你在说“给我一堆东西”。

话又说回来,这不一定是真的; JVM 不知道其中的区别,它在运行时看到的只是一个数组。许多程序员不会为方法签名的意图争论不休。 Varargs 就是为了让调用变得方便。

也就是说,可变参数的主要限制是这样的参数必须是方法的最后一个。对于您的情况来说,这不是问题,但一般来说这是需要考虑的。


3
投票

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

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

编译成

public void importFrom(String[] paths)
{
}

或者,您也可以使用

Iterable<String>
来更轻松地将参数作为集合传递。


2
投票

答案取决于函数的预期用途。如果用户通常在编码时知道他想要传入哪些参数,那么

varargs
就是正确的选择。如果用户需要能够在运行时确定参数的数量,数组参数将使他(或她)的生活变得更加轻松。


1
投票

我认为另一种选择是使用

List<String>
。就我个人而言,如果有多个参数或者参数是从某个地方自动处理的(例如从文件中解析),我会使用
List

如果您将在代码中手动编写参数,那么我更喜欢按照您的建议使用可变参数。


0
投票

您的方法可以接受列表或可变参数。

这里有一些关于为什么可变参数存在的历史,假设你有多个数据和一个采用列表的方法:

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 功能会自动执行并隐藏该过程。

© www.soinside.com 2019 - 2024. All rights reserved.