J2SE 1.5 引入的增強型 for 循環(foreach)並非適用於所有物件,只有兩種類型的對象才能被這種方式遍歷:
java.lang.Iterable 介面的類別實例若嘗試將其他類型的運算式放入循環中,編譯器將報錯:「foreach not applicable to expression type」。
java.lang.Iterable 介面僅定義一個方法:
Iterator iterator()
該方法返回一個實作了 java.util.Iterator 介面的物件。Iterator 介面則包含三個方法:
hasNext():判斷是否還有未訪問的元素next():返回下一個未訪問的元素remove():移除最近一次由 next() 返回的元素。這是可選操作,若不支援可拋出 UnsupportedOperationException。由於增強型 for 循環過程中永不調用此方法,因此是否實作不影響循環本身。透過這兩個介面,開發者即可自行實作可被增強型 for 循環遍歷的類別。
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
}
}
}
在 J2SE 1.5 API 中,所有可被增強型 for 循環遍歷的類型皆為 java.util.Collection 的子類型,乍看之下編譯器似乎給予了 Collection 特殊照顧。實際上,J2SE 1.5 將 java.util.Collection 定義為 java.lang.Iterable 的子介面,編譯器並未對 Collection 有任何特殊處理。理論上完全可以創建不實作 Collection 介面、卻能被增強型 for 循環遍歷的容器類別,但這類容器可能因相容性問題而難以普及。
觀察介面方法命名:Iterable 使用 iterator() 而非 getIterator();Iterator 使用 hasNext() 和 next() 而非 hasNextElement() 和 getNextElement()。Java Collections Framework 設計者認為這些方法會被頻繁調用(往往寫在同一行),較短的名稱更為適宜。