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










關于
Iterator 的部分真的很羅嗦,而且容易出錯。現在再看看 1.5 里帶來的 For-each 循環:
???? for ?(TimerTask?t?:?c)
????????t.cancel();
}
這個新的循環和泛型完美配合,既保持類型安全,又去掉了冗余。
以下是一個在試圖嵌套迭代的時候經常會犯的錯誤。

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() 被過多的調用了。
再看看新循環的表現,簡直是度身定造一樣的般配。
???? for ?(Rank?rank?:?ranks)
????????sortedDeck.add( new ?Card(suit,?rank));
?
for-each 循環也適用于數組,象隱藏迭代子一樣,這次它把數組下標藏起來了。
















?
那么我們什么時候該用 for-each 循環呢?只要情況運行就應該用,它真的讓你的代碼好看了很多。不幸的是,它有不能發揮作用的情形,就是需要用 iterator 的 remove 方法的時候,因為 iterator 被隱藏了,你也無法調用它的方法了,新的循環不適用于過濾元素。同樣的也不適用于需要把數組中的元素替換掉的情況。最后,它也不能在平行遍歷多個容器的情況里使用,這些缺點,設計者是知道的,但是最后他們明智地選擇這樣一個簡單的,能適用于多數情況的設計方案