【发布时间】:2019-12-16 19:44:25
【问题描述】:
使用可变参数允许一个函数声明可以对相同类型的可变数量的输入参数进行操作。这可以与for:each 循环结合使用,以便使用所有输入参数执行某些操作。
查看java.lang.Math 似乎max、min 和hypot 如果使用可变参数来实现都将更加有用。相反,它们每个都被定义为仅对 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遍历每个值。