第
四
道虎纹:
可变参数
机制
管中窥虎
在学习
java 1.5
的过程中,我使用了
sun
公布的
tutorial
,这份文档写的比较详尽易明,但是对于想快速了解
tiger
而且具有较好
java
基础的人来说,大篇幅的英文文档是比较耗时间和非必需的,所以我将会归纳这份文档的主要内容,在保证理解的底线上,尽力减少阅读者需要的时间。
在以下地址可以进入各新增语言特色介绍以及下载相关文档(若有)。
http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html
2006
年
8
月
17
日
星期四
Varargs
(理解为
var-args
可变参数)
在以前的版本里,一个接纳多个参数的方法,在调用前就需要用创建一个数组来放入这些参数,例如:
Object[] arguments
=
{
new
Integer(
7
),
new
Date(),
"
a disturbance in the Force
"
};
String result
=
MessageFormat.format(
"
At {1,time} on {1,date}, there was {2} on planet
"
+
"
{0,number,integer}.
"
, arguments);
现在依然必须这么传递,但varargs自动化并隐藏了这些步骤,而且还与已有的API兼容。之前的那个例子里,MessageFormat.format现在有了这样的声明:
public
static
String format(String pattern,
Object arguments);
在最后一个参数的类型后面的那三个句号,说明了这个参数可以传入一个数组或者一串参数。注意只能是最后那个参数才能有这种用法。现在这个方法可以这样引用:
String result
=
MessageFormat.format(
"
At {1,time} on {1,date}, there was {2} on planet
"
+
"
{0,number,integer}.
"
,
7
,
new
Date(),
"
a disturbance in the Force
"
);
Autoboxing
和varargs有着很强的配合关系,看看下面这些代码:
//
Simple test framework
public
class
Test
{
public
static
void
main(String[] args)
{
int
passed
=
0
;
int
failed
=
0
;
for
(String className : args)
{
try
{
Class c
=
Class.forName(className);
c.getMethod(
"
test
"
).invoke(c.newInstance());
passed
++
;
}
catch
(Exception ex)
{
System.out.printf(
"
%s failed: %s%n
"
, className, ex);
failed
++
;
}
}
System.out.printf(
"
passed=%d; failed=%d%n
"
, passed, failed);
}
}
这个小程序可能是最小型的完整的测试框架了。getMethod和printf方法由于varargs的缘故而不需要声明数组来传参了。代码比以前会清洁很多。
什么时候该用?作为客户端的话大可以好好利用,只要api里有提供,事实上java的核心api里的反射,信息格式化,和新的printf都用了varargs。而作为api的设计者,则应该谨慎地使用,只有你感觉到很有效果的时候才采取。总的来说,不要重载带varargs的方法,否则客户端程序员会很困惑哪个方法是被调用了。
posted on 2006-08-17 18:09
Ye Yiliang 阅读(1162)
评论(0) 编辑 收藏 所属分类:
Java