2006
年
8
月
15
日
星期二
管中窺虎
在學(xué)習(xí)
java 1.5
的過程中,我使用了
sun
公布的
tutorial
,這份文檔寫的比較詳盡易明,但是對(duì)于想快速了解
tiger
而且具有較好
java
基礎(chǔ)的人來說,大篇幅的英文文檔是比較耗時(shí)間和非必需的,所以我將會(huì)歸納這份文檔的主要內(nèi)容,在保證理解的底線上,盡力減少閱讀者需要的時(shí)間。
?
在以下地址可以進(jìn)入各新增語言特色介紹以及下載相關(guān)文檔(若有)。
http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html
?
第二道虎紋:
For-Each
循環(huán)
目前在一個(gè)容器里做迭代訪問挺郁悶的,看看下面這個(gè)方法,方法的目的是把容器里的一系列計(jì)時(shí)任務(wù)取消。
void
?cancelAll(Collection
<
TimerTask
>
?c)?
{

????
for
?(Iterator
<
TimerTask
>
?i?
=
?c.iterator();?i.hasNext();?)

????????i.next().cancel();

}
關(guān)于
Iterator
的部分真的很羅嗦,而且容易出錯(cuò)?,F(xiàn)在再看看
1.5
里帶來的
For-each
循環(huán):
void
?cancelAll(Collection
<
TimerTask
>
?c)?{
????
for
?(TimerTask?t?:?c)
????????t.cancel();
}
這個(gè)新的循環(huán)和泛型完美配合,既保持類型安全,又去掉了冗余。
以下是一個(gè)在試圖嵌套迭代的時(shí)候經(jīng)常會(huì)犯的錯(cuò)誤。
List?suits?
=
?
;
List?ranks?
=
?
;
List?sortedDeck?
=
?
new
?ArrayList();
?
//
?BROKEN?-?throws?NoSuchElementException!
for
?(Iterator?i?
=
?suits.iterator();?i.hasNext();?)
????
for
?(Iterator?j?
=
?ranks.iterator();?j.hasNext();?)
????????sortedDeck.add(
new
?Card(i.next(),?j.next()));
?
原因是
i.next()
被過多的調(diào)用了。
再看看新循環(huán)的表現(xiàn),簡(jiǎn)直是度身定造一樣的般配。
for
?(Suit?suit?:?suits)
????
for
?(Rank?rank?:?ranks)
????????sortedDeck.add(
new
?Card(suit,?rank));
?
for-each
循環(huán)也適用于數(shù)組,象隱藏迭代子一樣,這次它把數(shù)組下標(biāo)藏起來了。
//
?Returns?the?sum?of?the?elements?of?a
int
?sum(
int
[]?a)?
{

????
int
?result?
=
?
0
;

????
for
?(
int
?i?:?a)

????????result?
+=
?i;

????
return
?result;

}
?
那么我們什么時(shí)候該用
for-each
循環(huán)呢?只要情況運(yùn)行就應(yīng)該用,它真的讓你的代碼好看了很多。不幸的是,它有不能發(fā)揮作用的情形,就是需要用
iterator
的
remove
方法的時(shí)候,因?yàn)?/span>
iterator
被隱藏了,你也無法調(diào)用它的方法了,新的循環(huán)不適用于過濾元素。同樣的也不適用于需要把數(shù)組中的元素替換掉的情況。最后,它也不能在平行遍歷多個(gè)容器的情況里使用,這些缺點(diǎn),設(shè)計(jì)者是知道的,但是最后他們明智地選擇這樣一個(gè)簡(jiǎn)單的,能適用于多數(shù)情況的設(shè)計(jì)方案
posted on 2006-08-15 18:06
Ye Yiliang 閱讀(2485)
評(píng)論(8) 編輯 收藏 所屬分類:
Java