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:网上经常有人把内部类和嵌套类的概念搞错了,我在这里更正一下。)
 
 

转载于:https://www.cnblogs.com/sqtds/archive/2013/06/10/3130566.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值