【问题标题】:When to prefer a varargs list to an array?何时更喜欢可变参数列表而不是数组?
【发布时间】:2011-10-31 08:31:41
【问题描述】:

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

public void importFrom(String... paths) {

}

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

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

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

【问题讨论】:

  • 你仍然可以将数组传递给可变参数方法,它的行为是一样的。

标签: java variadic-functions


【解决方案1】:

在您的情况下,可变参数就可以了。您实际上并不需要创建将要导入的路径数组,因为除了将它们传递给您的 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 就是为了方便调用。

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

【讨论】:

  • +1 表示数组传递——我仍然觉得关于“区别数组对象”的段落有点令人困惑:我看到传递实际数组的唯一原因是调用者可以看到由被调用者(反转、排序)——但搜索不需要这个?
  • 是的,写得不好,也许不是很重要。我对其进行了一些改写,以使其不那么令人困惑,并表明这是一个小问题,如果它确实是一个问题的话。谢谢。
【解决方案2】:

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

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

编译成

public void importFrom(String[] paths)
{
}

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

【讨论】:

    【解决方案3】:

    答案取决于函数的预期用途。如果用户通常在编码时知道他想要传递哪些参数,那么varargs 就是要走的路。如果用户需要能够在运行时确定参数的数量,数组参数将使他(或她)的生活变得更轻松。

    【讨论】:

    • 我认为他在谈论一个开放的数组参数。在旧语言中,确定参数结束的唯一方法是使用金丝雀或格式字符串。在java中不是这样。为简单起见,我会使用可变参数,因为您不需要制作临时列表,从而使代码可能更易于理解
    • “如果用户需要能够在运行时确定参数的数量”,他只需传递一个数组。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 2010-09-24
      • 2010-09-20
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多