【问题标题】:What are the drawbacks of implementing functions using Varargs? [duplicate]使用 Varargs 实现函数的缺点是什么? [复制]
【发布时间】:2019-12-16 19:44:25
【问题描述】:

使用可变参数允许一个函数声明可以对相同类型的可变数量的输入参数进行操作。这可以与for:each 循环结合使用,以便使用所有输入参数执行某些操作。

查看java.lang.Math 似乎maxminhypot 如果使用可变参数来实现都将更加有用。相反,它们每个都被定义为仅对 2 个输入参数起作用。

一个可以用可变参数实现的函数的例子是平均函数。

public static double average(double... numbers) {
    double total = 0.0;

    for (double d : numbers) {
        total += d;
    }

    return total / numbers.length;
}

我的问题是,使用可变参数实现函数有什么缺点?为什么JDK中包含的大多数库在适用时不使用可变参数?

【问题讨论】:

  • 您需要通过不忘记历史来查看设计选择。可变参数是在 Java 5 中引入的,Math.max() 从 Java 1.0 开始就存在。 Varargs 也有代价:每次调用都需要创建一个新数组。
  • 请注意,本文中average(double...) 的当前实现允许调用者提供零参数。问题来了:什么都没有的平均值是多少?
  • @MC Emperor 不过这可以用average(double d, double ... numbers) 修复,对吧?这将需要至少 1 个double 才能通过。我认为类似的修复可以在很多情况下起作用。缺点是需要适应该值,而不是能够使用简单的for-each 遍历每个值。

标签: java arrays function


【解决方案1】:

varargs 只是语法糖,将函数中提供的多个参数包装到一个数组中,然后将该数组传递给函数。它有什么好处?它可能会节省一些时间来编写手动包装。有什么缺点?使用相同的 max 和 min 示例,这些方法是在 Java 1.0 中添加的,然后才添加可变参数。一般来说,保持向后兼容性是一件好事

【讨论】:

  • 仍然会保持向后兼容性。由于对函数的所有旧调用都使用 2 个参数,因此重新定义函数以使用未知参数应该不会对 2 个参数调用产生不利影响。
  • @Karson 可用于源代码兼容性:您重新编译,它仍然可以正常编译。但是二进制兼容性会丢失(您无需重新编译,而是使用采用 vararg 的较新方法)。他们可以添加一个采用可变参数的附加方法,但这种用例非常少见,并且已经被 Collections.max、Stream.max 等覆盖。
猜你喜欢
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2016-01-14
相关资源
最近更新 更多