4. 被這樣遍歷的前提
有兩種類型的對象可以通過這種方法來遍歷——數組和實現了Java.lang.Iterable接口的類的實例。試圖將結果是其它類型的表達式放在這個位置上,只會在編譯時導致一個提示信息是“foreach not applicable to expression type”的問題。
Java.lang.Iterable接口中定義的方法只有一個:
iterator()
返回一個實現了Java.util.Iterator接口的對象
而Java.util.Iterator接口中,則定義了這樣三個方法:
hasNext()
返回是否還有沒被訪問過的對象
next()
返回下一個沒被訪問過的對象
remove()
把最近一次由next()返回的對象從被遍歷的對象裡移除。這是一個可選的操作,如果不打算提供這個功能,在實現的時候拋出一個UnsupportedOperationException即可。因為在整個循環的過程中,這個方法根本沒有機會被調用,所以是否提供這個功能,在這裡沒有影響。
借助這兩個接口,就可以自行實現能被這樣遍歷的類了。---www.bianceng.cn。
清單12:一個能取出10個Object元素的類
import Java.util.*;
class TenObjects implements Iterable {
public Iterator iterator() {
return new Iterator() {
private int count = 0;
public boolean hasNext() {
return (count < 10);
}
public Object next() {
return new Integer(count++);
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] args)
{
TenObjects objects = new TenObjects();
for (Object i : objects)
{
System.out.println(i);/* 依次輸出從“0"到“9”的十個整數 */
}
}
}
Collection的資格問題
在J2SE 1.5的API中,所有能被這樣遍歷的對象的類型都是java.util.Collection的子類型,看上去很象Java.util.Collection獲得了編譯器的特殊對待。
不過,造成這種現象的實際原因,是在J2SE 1.5中,java.util.Collection被定義成了Java.lang.Iterable的子接口。編譯器並沒有給Collection什麼特別的關照。
從理論上說,完全可以制造出一些拒不實現Collection接口的容器類,而且能讓它們和Collection一樣被用這種方法遍歷。不過這樣的容器類,可能會因為存在兼容性的問題,而得不到廣泛的流傳。
若干方法的命名問題
在java.lang.Iterable接口中,使用iterator(),而不是getIterator();而java.util.Iterator接口中,也使用hasNext()和next(),而不是hasNextElement()和getNextElement()。造成這種現象的原因,是Java Collections Framework的設計者們,認為這些方法往往會被頻繁的調用(每每還會擠到一行),所以用短一點的名字更為合適。