主题:[转帖]Java5可变参数初探
Java语言编程中,从Java5开始引入了可变参数的概念;引入可变参数的目的,是为了解决形如下面代码的编码冗余.
public class EnableChangeArgument{
private int a,b,c,d;
private void p()
{
System.out.println(a+","+b+","+c+","+d);
}
public void foo(int a)
{
this.a = a;
p();
}
public void foo(int a,int b)
{
this.a = a;
this.b = b;
p();
}
public void foo(int a,int b,int c)
{
this.a = a;
this.b = b;
this.c = c;
p();
}
public void foo(int a,int b,int c,int d)
{
this.a = a;
this.b = b;
this.c = c;
this.d = d;
p();
}
public static void main(String[] args) {
EnableChangeArgument eca = new EnableChangeArgument();
eca.foo(1,4);
}
}
上面的代码中,是一个面向对象编程中的常用的方法重载,目的是为了解决“foo”方法输入参数的个数是可以变化的问题,也就是可变参数的问题.我们可以看到,利用方法重载来解决可变参数的问题,我们需要写出多个方法来做同一件事情,这使得我们的编码效率大大降低.
为了提高编码效率,我们从Java5开始引入了可变参数的概念,通过可变参数上面的代码可以写成下面的样子:
public class EnableChangeArgument{
private int a,b,c,d;
public void foo(int... nums)
{
int len = nums.length;
if(len>0) a = nums[0];
if(len>1) b = nums[1];
if(len>2) c = nums[2];
if(len>3) d = nums[3];
//todo
System.out.println(a+","+b+","+c+","+d);
}
public static void main(String[] args) {
EnableChangeArgument eca = new EnableChangeArgument();
eca.foo(1,4);
}
}
可以看出,随着Java5引入的可变参数概念,的确使得我们的编码量大大减轻,使得我们朝着敏捷编程的方向在前进.但是,可变参数的引入,仍然有以下三个问题没有解决:一是,可读性的问题,作为EnableChangeArgument类的使用者,我们不知道“eca.foo(1,4)”中的“1”和“4”代表的含义.二是,参数顺序的问题,比如我们想将1赋给a,4赋给b,当然只能严格写成“eca.foo(1,4)”,而不能写成“eca.foo(4,1)”.三是,灵活性不足,比如,我们只想给a赋值1,c赋值3,我们就得写成这样的“eca.foo(1,0,3)”,而不能写成这样“eca.foo(1,3)”.
--------
[url=http://www.txdnet.cn/ShowListEssay-2-1-Txdnet.jsp]http://www.txdnet.cn/ShowListEssay-2-1-Txdnet.jsp[/url]
public class EnableChangeArgument{
private int a,b,c,d;
private void p()
{
System.out.println(a+","+b+","+c+","+d);
}
public void foo(int a)
{
this.a = a;
p();
}
public void foo(int a,int b)
{
this.a = a;
this.b = b;
p();
}
public void foo(int a,int b,int c)
{
this.a = a;
this.b = b;
this.c = c;
p();
}
public void foo(int a,int b,int c,int d)
{
this.a = a;
this.b = b;
this.c = c;
this.d = d;
p();
}
public static void main(String[] args) {
EnableChangeArgument eca = new EnableChangeArgument();
eca.foo(1,4);
}
}
上面的代码中,是一个面向对象编程中的常用的方法重载,目的是为了解决“foo”方法输入参数的个数是可以变化的问题,也就是可变参数的问题.我们可以看到,利用方法重载来解决可变参数的问题,我们需要写出多个方法来做同一件事情,这使得我们的编码效率大大降低.
为了提高编码效率,我们从Java5开始引入了可变参数的概念,通过可变参数上面的代码可以写成下面的样子:
public class EnableChangeArgument{
private int a,b,c,d;
public void foo(int... nums)
{
int len = nums.length;
if(len>0) a = nums[0];
if(len>1) b = nums[1];
if(len>2) c = nums[2];
if(len>3) d = nums[3];
//todo
System.out.println(a+","+b+","+c+","+d);
}
public static void main(String[] args) {
EnableChangeArgument eca = new EnableChangeArgument();
eca.foo(1,4);
}
}
可以看出,随着Java5引入的可变参数概念,的确使得我们的编码量大大减轻,使得我们朝着敏捷编程的方向在前进.但是,可变参数的引入,仍然有以下三个问题没有解决:一是,可读性的问题,作为EnableChangeArgument类的使用者,我们不知道“eca.foo(1,4)”中的“1”和“4”代表的含义.二是,参数顺序的问题,比如我们想将1赋给a,4赋给b,当然只能严格写成“eca.foo(1,4)”,而不能写成“eca.foo(4,1)”.三是,灵活性不足,比如,我们只想给a赋值1,c赋值3,我们就得写成这样的“eca.foo(1,0,3)”,而不能写成这样“eca.foo(1,3)”.
--------
[url=http://www.txdnet.cn/ShowListEssay-2-1-Txdnet.jsp]http://www.txdnet.cn/ShowListEssay-2-1-Txdnet.jsp[/url]