?
第
四
道虎紋:
可變參數(shù)
機(jī)制
?
管中窺虎
在學(xué)習(xí)
java 1.5
的過(guò)程中,我使用了
sun
公布的
tutorial
,這份文檔寫的比較詳盡易明,但是對(duì)于想快速了解
tiger
而且具有較好
java
基礎(chǔ)的人來(lái)說(shuō),大篇幅的英文文檔是比較耗時(shí)間和非必需的,所以我將會(huì)歸納這份文檔的主要內(nèi)容,在保證理解的底線上,盡力減少閱讀者需要的時(shí)間。
?
在以下地址可以進(jìn)入各新增語(yǔ)言特色介紹以及下載相關(guān)文檔(若有)。
http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html
?
2006
年
8
月
17
日
星期四
Varargs
(理解為
var-args
可變參數(shù))
在以前的版本里,一個(gè)接納多個(gè)參數(shù)的方法,在調(diào)用前就需要用創(chuàng)建一個(gè)數(shù)組來(lái)放入這些參數(shù),例如:
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);
現(xiàn)在依然必須這么傳遞,但varargs自動(dòng)化并隱藏了這些步驟,而且還與已有的API兼容。之前的那個(gè)例子里,MessageFormat.format現(xiàn)在有了這樣的聲明:
public
?
static
?String?format(String?pattern,
????????????????????????????????Object
?arguments);
在最后一個(gè)參數(shù)的類型后面的那三個(gè)句號(hào),說(shuō)明了這個(gè)參數(shù)可以傳入一個(gè)數(shù)組或者一串參數(shù)。注意只能是最后那個(gè)參數(shù)才能有這種用法。現(xiàn)在這個(gè)方法可以這樣引用:
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有著很強(qiáng)的配合關(guān)系,看看下面這些代碼:
?
//
?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);

????}
}
?
這個(gè)小程序可能是最小型的完整的測(cè)試框架了。getMethod和printf方法由于varargs的緣故而不需要聲明數(shù)組來(lái)傳參了。代碼比以前會(huì)清潔很多。
什么時(shí)候該用?作為客戶端的話大可以好好利用,只要api里有提供,事實(shí)上java的核心api里的反射,信息格式化,和新的printf都用了varargs。而作為api的設(shè)計(jì)者,則應(yīng)該謹(jǐn)慎地使用,只有你感覺到很有效果的時(shí)候才采取。總的來(lái)說(shuō),不要重載帶varargs的方法,否則客戶端程序員會(huì)很困惑哪個(gè)方法是被調(diào)用了。
posted on 2006-08-17 18:09
Ye Yiliang 閱讀(1180)
評(píng)論(0) 編輯 收藏 所屬分類:
Java