首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2SE

深入體驗 J2SE 1.5 增強型 For 循環:遍歷機制與實作細節

     編輯:J2SE

增強型 For 循環的適用前提

J2SE 1.5 引入的增強型 for 循環(foreach)並非適用於所有物件,只有兩種類型的對象才能被這種方式遍歷:

  • 陣列
  • 實作了 java.lang.Iterable 介面的類別實例

若嘗試將其他類型的運算式放入循環中,編譯器將報錯:「foreach not applicable to expression type」。

核心介面:Iterable 與 Iterator

java.lang.Iterable 介面僅定義一個方法:

Iterator iterator()

該方法返回一個實作了 java.util.Iterator 介面的物件。Iterator 介面則包含三個方法:

  • hasNext():判斷是否還有未訪問的元素
  • next():返回下一個未訪問的元素
  • remove():移除最近一次由 next() 返回的元素。這是可選操作,若不支援可拋出 UnsupportedOperationException。由於增強型 for 循環過程中永不調用此方法,因此是否實作不影響循環本身。

透過這兩個介面,開發者即可自行實作可被增強型 for 循環遍歷的類別。

範例:可產生 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 中,所有可被增強型 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 設計者認為這些方法會被頻繁調用(往往寫在同一行),較短的名稱更為適宜。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved