为什么我们不在汇集接口中放入hasNext(),next()和其他方法?

时间:2015-02-01 09:17:28

标签: java oop interface

我对Java中的设计问题感到困惑。它在接口Collection下实现了许多抽象容器,并提供了方法hasNext()和Next()以及类Iterator。如果我将这些方法直接放在接口Collection下,然后在每个子类中覆盖它,那么有什么缺点:

例如,我已经实现了Next();类ArrayList下的hasNext()方法。所以我写的是

ArrayList ArrList=new ArrayList()
if(ArrList.hasNext())
  new obj=ArrList.next(); 
}

返回存储在ArrList中的对象。

为接口Collection引入Iterator类是多余的吗?设计ArrList.iterator()有什么好处;如果在界面中设置它更方便吗?

我能找到任何书来解决这种设计问题吗(正如计算机科学家所描述的那样)?

感谢您的时间。

5 个答案:

答案 0 :(得分:2)

Iterator接口的方法(next()hasNext())不能简单地添加到接口中。迭代器的状态决定了迭代器返回的下一个元素。

如果Iterator方法是Collection接口的一部分,则需要一些额外的方法来重置这个“内置”迭代器(为了从Collection的开头再次迭代) ,在任何给定时间内,每个Collection只能有一个迭代器。嵌套迭代就像下面的代码片段一样简单,因为它需要两个迭代器:

List<Integer> list = ...
for (int i : list)
    for (int j : list)
        System.out.println(i+j);

答案 1 :(得分:1)

Iterator存储指向集合内某个元素的指针。在ArrayList的情况下,它是底层数组的索引。

它允许您说同时在两个单独的线程中迭代集合。如果指针是ArrayList的一部分,则每个线程都会跳过一些元素。

答案 2 :(得分:1)

通常使迭代器遍历一次。如果在遍历迭代器期间对底层集合进行了修改,则Java集合库中的类将失败。

顺便说一句,这个问题可能更适合致力于理论编程问题的Programmers Stack Exchange

答案 3 :(得分:1)

我们暂时假设ArrayList确实有hasNextnext方法,因此您的代码会编译。 (你还需要另一种方法来告诉列表你想重新开始。)这意味着我一次只能激活列表的一次迭代,因为列表本身包含迭代状态。这只是糟糕的设计;相反,我们有Iterator概念,因此迭代的状态存储在 iterator 中,而不是列表中,我们可以有多个迭代器。

答案 4 :(得分:1)

在概念层面:Collection代表一组对象。为hasNextnext添加方法会将其转换为对象的集合以及另一个州,一个&#39;当前对象&#39;以及关于如何遍历集合的一些概念。

由于这是两个独立的想法,因此最好将它们分成独立实施的独立结构。在你说的情况下,那将是Collection结构(处理对象集合的存储和结构),以及Iterator结构(处理某些对象集合的位置和遍历)