我害怕变参数。我不知道要用它们做什么。
另外,让人们随意争论是很危险的。
有什么上下文的例子可以很好地使用它们?
我害怕变参数。我不知道要用它们做什么。
另外,让人们随意争论是很危险的。
有什么上下文的例子可以很好地使用它们?
当前回答
一个好的经验法则是:
“对于任何需要T数组(不管T是什么类型)作为输入的方法(或构造函数)使用可变参数”。
这将使对这些方法的调用更容易(不需要执行新的T[]{…})。
您可以扩展此规则以包含带有List<T>参数的方法,前提是该参数仅用于输入(即,该方法未修改列表)。
另外,我会避免使用f(Object…args),因为它滑向了一种api不清晰的编程方式。
在例子方面,我已经在DesignGridLayout中使用了它,在那里我可以在一个调用中添加几个JComponents:
layout.row().grid(new JLabel("Label")).add(field1, field2, field3);
在上面的代码中,add()方法定义为add(JComponent…组件)。
最后,这种方法的实现必须注意这样一个事实,即它可能被一个空变量调用!如果你想要强加至少一个论点,那么你必须使用一个丑陋的技巧,例如:
void f(T arg1, T... args) {...}
我认为这个技巧很丑,因为该方法的实现将不像只有T…参数列表中的参数。
希望这有助于澄清关于可变参数的观点。
其他回答
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
对于任何需要处理不确定数量的对象的方法,可变参数都很有用。一个很好的例子是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以拒绝。
当我们不确定要在方法中传递的参数数量时,可以使用变参数。它在后台创建一个不指定长度的参数数组,这样的参数在运行时可以被视为数组。
如果我们有一个方法被重载以接受不同数量的参数,那么我们可以简单地使用可变参数的概念,而不是多次重载该方法。
此外,当参数的类型将发生变化时,则使用“Object…Test”将大大简化代码。
例如:
public int calculate(int...list) {
int sum = 0;
for (int item : list) {
sum += item;
}
return sum;
}
这里间接地将int类型的数组(list)作为参数传递,并在代码中作为数组处理。
为了更好地理解这个概念,请点击这个链接(它帮助我清楚地理解这个概念): http://www.javadb.com/using-varargs-in-java
附注:即使是我也害怕在不知道的情况下使用可变参数。但现在我已经习惯了。 正如俗话所说:“我们执着于已知,害怕未知”,所以尽可能多地使用它,你也会开始喜欢它:)
一个好的经验法则是:
“对于任何需要T数组(不管T是什么类型)作为输入的方法(或构造函数)使用可变参数”。
这将使对这些方法的调用更容易(不需要执行新的T[]{…})。
您可以扩展此规则以包含带有List<T>参数的方法,前提是该参数仅用于输入(即,该方法未修改列表)。
另外,我会避免使用f(Object…args),因为它滑向了一种api不清晰的编程方式。
在例子方面,我已经在DesignGridLayout中使用了它,在那里我可以在一个调用中添加几个JComponents:
layout.row().grid(new JLabel("Label")).add(field1, field2, field3);
在上面的代码中,add()方法定义为add(JComponent…组件)。
最后,这种方法的实现必须注意这样一个事实,即它可能被一个空变量调用!如果你想要强加至少一个论点,那么你必须使用一个丑陋的技巧,例如:
void f(T arg1, T... args) {...}
我认为这个技巧很丑,因为该方法的实现将不像只有T…参数列表中的参数。
希望这有助于澄清关于可变参数的观点。