探究Iterator爲何設計成接口,以及具體實現

假設迭代器定義的是一個類,這樣我們就可以創建該類的對象,調用該類的方法來實現集合的遍歷。但是,Java提供了很多的集合類,這些集合類的數據結構是不同的。所以,存儲的方式和遍歷的方式應該是不同的。進而它們的遍歷方式也應該不是一樣的。最終,就沒有定義迭代器類。

而無論哪種集合,都應該具備獲取元素的操作,而且,最好在輔助於判斷功能,這樣,在獲取前,先判斷,更不容易出錯。也就是說,判斷功能和獲取功能應該是一個集合遍歷所具備的,而每種集合的方式又不太一樣,所以我們把這兩個功能給提取出來,並不提供具體實現,這種方式就是接口。

    那麼真正的具體的實現類在哪裏呢?

    在真正的具體子類中,以內部類的方式體現的。

例如ArrayList類中的iterator()方法,ArrayList中的iterator()從父類中繼承並重寫,通過觀察ArrayList源碼

 public Iterator<E> iterator() {
        return new Itr();
 }

private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

可以看出ArrayList的iterator()方法,返回了一個實現了Iterator接口的Itr類對象,這個Itr被設計成ArrayList的內部類,重寫了next()、hasNext()和remove()方法

public interface Inteator {
	boolean hasNext();
	Object next(); 
}

public interface Iterable {
    Iterator iterator();
}

public interface Collection extends Iterable {
	Iterator iterator();
}

public interface List extends Collection {
	Iterator iterator();
}

public class ArrayList implements List {
	public Iterator iterator() {
        return new Itr();
    }
    
    private class Itr implements Iterator {
    	public boolean hasNext() {}
        public Object next(){} 
    }
}


Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator();	 //new Itr();
while(it.hasNext()) {
	String s = (String)it.next();
	System.out.println(s);
}

 


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章