程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2SE >> 體驗J2SE 1.5新特性之增強For循環(4)

體驗J2SE 1.5新特性之增強For循環(4)

編輯:J2SE

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的設計者們,認為這些方法往往會被頻繁的調用(每每還會擠到一行),所以用短一點的名字更為合適。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved