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

标签 java variadic-functions

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

public void importFrom(String... paths) {

}

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

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

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

最佳答案

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

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

关于java - 何时更喜欢可变参数列表而不是数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7951339/

相关文章:

java - EJB3 Query + in 子句

java - 如何通过自己的类删除一个对象?

c++ - va_list 值始终为 -52 并且使用字符串会崩溃

c++ - 可变参数函数的内联

c++ - 是否可以为具有可变参数的宏定义 c++ 包装函数?

java - 在 Stream API 中使用 checked 装饰器函数是好的解决方案吗?

java - 红外遥控应用程序

java - 从 android 中的 AccessibilityService 创建对 Activity 的回调

scala - 解释可变参数的 Scala 语法

c++ - va_arg 返回错误的参数