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:网上经常有人把内部类和嵌套类的概念搞错了,我在这里更正一下。)
 
 
posted @ 2013-06-10 10:59  sqtds  阅读(1010)  评论(0编辑  收藏  举报