我害怕变参数。我不知道要用它们做什么。
另外,让人们随意争论是很危险的。
有什么上下文的例子可以很好地使用它们?
我害怕变参数。我不知道要用它们做什么。
另外,让人们随意争论是很危险的。
有什么上下文的例子可以很好地使用它们?
当前回答
在var - args的Java文档中,var args的用法非常清楚:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html
关于用法,它说:
那么什么时候应该使用可变参数呢? 作为客户端,只要API提供它们,您就应该利用它们。在核心api中的重要用途包括反射、消息格式化和新的printf功能。 作为API设计人员,您应该谨慎使用它们,只有当好处真正引人注目时。 一般来说,你不应该重载一个varargs方法,否则程序员很难弄清楚调用了哪个重载。”
其他回答
对于任何需要处理不确定数量的对象的方法,可变参数都很有用。一个很好的例子是String.format。格式字符串可以接受任意数量的参数,因此需要一种机制来传入任意数量的对象。
String.format("This is an integer: %d", myInt);
String.format("This is an integer: %d and a string: %s", myInt, myString);
我经常使用可变参数作为构造函数,这些构造函数可以接受某种过滤器对象。例如,我们基于Hadoop的系统的很大一部分是基于Mapper的,Mapper处理对JSON的项的序列化和反序列化,并应用了许多处理器,每个处理器获取一个内容项,要么修改并返回它,要么返回null以拒绝。
在var - args的Java文档中,var args的用法非常清楚:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html
关于用法,它说:
那么什么时候应该使用可变参数呢? 作为客户端,只要API提供它们,您就应该利用它们。在核心api中的重要用途包括反射、消息格式化和新的printf功能。 作为API设计人员,您应该谨慎使用它们,只有当好处真正引人注目时。 一般来说,你不应该重载一个varargs方法,否则程序员很难弄清楚调用了哪个重载。”
Varargs是java 1.5版本中添加的特性。
为什么要用这个?
如果你不知道要传递给一个方法的参数的数量呢? 如果你想给一个方法传递无限个参数呢?
这是怎么回事?
它用给定的参数创建一个数组并将数组传递给方法。
例子:
public class Solution {
public static void main(String[] args) {
add(5,7);
add(5,7,9);
}
public static void add(int... s){
System.out.println(s.length);
int sum=0;
for(int num:s)
sum=sum+num;
System.out.println("sum is "+sum );
}
}
输出:
2
和是12
3
和是21
我也有一种与内变性有关的恐惧:
如果调用者将显式数组传递给方法(而不是多个参数),则您将收到对该数组的共享引用。
如果需要在内部存储这个数组,可能需要首先克隆它,以避免调用者以后能够更改它。
Object[] args = new Object[] { 1, 2, 3} ;
varArgMethod(args); // not varArgMethod(1,2,3);
args[2] = "something else"; // this could have unexpected side-effects
虽然这与传入任何类型的对象并没有真正的区别,这些对象的状态稍后可能会改变,因为数组通常(在调用多个参数而不是数组的情况下)是编译器内部创建的一个新对象,您可以安全地使用,这当然是意想不到的行为。