首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

从JDK观设计模式之行为模式:迭代器(深入)

2013-09-26 
从JDK看设计模式之行为模式:迭代器(深入)public static void main(String[] args) {CollectionString co

从JDK看设计模式之行为模式:迭代器(深入)
public static void main(String[] args) {Collection<String> collection = new ArrayList<String>();collection.add("开源中国");collection.add("csdn");collection.add("Iteye");collection.add("黑马");collection.add("虎嗅网");collection.add("环球军事");// 取得容器的迭代器Iterator<String> iterator = collection.iterator();// 遍历String content = "";while (iterator.hasNext()) {content = iterator.next();if(content == "Iteye"){System.out.println("Bingo Iteye");break;}}//再次遍历Iterator<String> iterator2 = collection.iterator();while (iterator.hasNext()) {content = iterator2.next();if(content == "csdn"){System.out.println("Bingo csdn");break;}}}

? ? ? ??假设把hasNext方法和next方法当作容器的成员方法,类似在JDK中的实现,在容器里需要维护有一个变量(index)记录当前访问到第几个元素,以便和容器大小相比较,判断是否有下一个元素(hasNext方法),然后同样需要通过这个index访问元素(next方法)。

? ?如果这个index是成员变量,那么该变量属于类的,不会在每次方法执行后自动消亡,第一次查找“iteye”的时候,在第3个元素中找到了它,index =?2?(下标从0?开始),我还需要查找容器是否包含字符串“csdn”,此时再次执行hasNext方法的时候,index此时是从2开始的,而我们需要的是从头开始遍历,显然不合要求? ?如果这个index放在方法体hasNext内部,每次在执行hasNext的时候确实能做到从0开始,但这样next方法又无法通过index得到该元素,因为index的作用域是hasNext方法。放在一个类里就是一个很好的解决方案,每次遍历都new一个新的对象,该对象满足index从0开始,同时next方法和hasNext方法共享该变量。

? ? ? ?在Java中每次执行Iterator方法的时候,总是new 一个新的Iterator的实现类,如HashMap中的KeyIterator。这样确保index每次都是从0开始,而且结束方法Iterator执行完毕后,hasNext方法和next方法仍能够共享变量index,因为此时这两个方法是在同一个类中。java是用内部类的方法来定义的,实际上用外围类也可以,只是内部类可以更好的隐藏细节。

?

热点排行