how to 编写一个Iterator
首先,考虑编写iterator,我们需要基于哪几个方面的考虑:
由于迭代器会访问List的私有域,因此,可以有2种方式:
一种的改变List的域的可见性,让其变成public或friendly(默认的可见性,即包可见性)的,不过这违反了良好的面向对象编程的羁绊原则,它要求数据尽可能的隐蔽。
另外一种是为List添加一个内部类或者嵌套类,然后我们来看这2种类的区别。
首先我们需要先理解一下2种类的概念:
将一个类放入另一个类的内部,当这个类是static的,表示嵌套类,否则这个类就是内部类。
1,嵌套类
嵌套类是外部类的一部分,所以可以访问外部类,特性:
嵌套类访问外部类:
不能直接访问外部类的非静态成员
只能直接访问外部类的静态成员
外部类访问嵌套类:
外部类可以访问嵌套类的私有成员 和公有成员
so this is 代码实现:
private static class MyIterator<T>{ MyList<T> list ; int iteratorIndex = 0; public MyIterator(MyList<T> myList){ list = myList; } public boolean hasNext(){ return list.length>iteratorIndex; } public T next(){ return list.arrays[iteratorIndex++]; } public void remvoe(){ list.remove(iteratorIndex--); } }
2,内部类
当声明一个内部类时,编译器会添加对外部类的一个隐式引用,该对象引起内部类对象的构造。
如果外部类的名字是Outer,则隐式引用就是Outer.this。
实现:
private class MyIterator<T>{ int iteratorIndex = 0; public MyIterator(){ } public boolean hasNext(){ return length>iteratorIndex; } public T next(){ return (T)arrays[iteratorIndex++]; } public void remvoe(){ MyList.this.remove(iteratorIndex--); } }
然后我们再考虑以下方面:
嵌套类的问题在于,在我们的原始设计中,当编写arrays而不引用而不引用所在的MyList对象时,代码看起来还行,也似乎有意义,但确实无效的,因为编译器不可能计算出哪个MyList在被引用,要是我们自己能够不必知道这点就好了,而内部类恰好是我们需要的。
在每一个内部类的对象恰好与外部类的一个实例相关联的请情况下,内部类是有用的。
在这种情况下,内部类的对象在没有外部类对象与其关联时事永远不可能纯在的,对于迭代器的情形,这种情况刚好适用。
用内部类实现的代码更加简洁有效。
考虑了这些以后,所以实现一个迭代器的最佳方案就是用内部类。
(ps:网上经常有人把内部类和嵌套类的概念搞错了,我在这里更正一下。)