看看A和B哪个实现更好?
interface E{ public void do0(); public void do1(); public void do2(); //... public void doN(); }
class A{ public void doSomething(Collection<E> c){ for(Iterator<E> i = c.iterator();i.hasNext();){ i.next().do0(); } } }
class B{
public void doSomething(List<E> c){ for(int i=0;i<c.size();i++){ c.get(i).do0(); } }
public void doSomething(Set<E> c){ for(Iterator<E> i = c.iterator();i.hasNext();){ i.next().do0(); } } }
|
假设编写完成后 需求改了,我要在遍历的时候加入do1(),那么A只要改一处,而B要修改两处。
再假设,需求又改了,我又要加入do2(),那么A还是要改一处,B还是要改两处。
依次类推,需求改了N次,那么A一共改了N次,B却要改动2N次。
如果程序中用到的Collection接口的实现类有M个。那么为应对N次的需求修改,A的代价还是N次,而B则要M*N次。
至此Iterator的好处不言而喻。记得Gof那本书里讲过。
使用Iterator的关键,是把所有Collection的遍历定义了统一的接口,使用起来不必关心具体的遍历是如何实现的(不管List,Set,还是什么其他的),只要拿来用就可以了,因为在大多数情况下,我们都只是需要把每个元素拿出来,然后对元素进行操作就可以了。
举个例子,假如我有一个实现Collection接口的二叉树类,你可以对该二叉树进行“先序遍历”“中序遍历”或“后序遍历”,那我只要在二叉树类中实现些遍历,然后通过Iterator接口返回给你,而不管是哪种遍历,你的用法永远都是同一个样子:
for(Iterator<E> i = c.iterator();i.hasNext();){ i.next().do0(); }
|
你根本不必知道什么是“先序遍历”“中序遍历”“后序遍历”、。。。。“乱七八糟遍历”这就像躲在窗口里边的售票员,她只负责喊:“下一个”,然后收钱卖票。她不会理会买票的人是排队的,还是夹塞的。
---------------------------------------------------------
另外:size()本身有最大值的缺陷。
api doc:
size
int size()
Returns the number of elements in this list. If this list contains more than Integer.MAX_VALUE elements, returns Integer.MAX_VALUE.
Specified by:
size in interface Collection<E>
Returns:
the number of elements in this list
[该贴被darasion于2008-12-22 15:29修改过]
[该贴被darasion于2008-12-22 15:32修改过]
[该贴被darasion于2008-12-22 16:03修改过]