为什么不把hasNext()、next()等方法放在Collection接口中呢?

Why don't we put the hasNext(), next() and other methods in Collection interface?

我对 Java 中的设计问题感到困惑。它在Collection接口下实现了很多抽象容器,并提供了方法hasNext()和Next()以及class Iterator。如果我将这些方法直接放在接口 Collection 下,然后在每个 subclass:

中覆盖它,有什么缺点

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

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

返回存储在 ArrList 中的对象。

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

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

感谢您的宝贵时间。

迭代器存储指向集合中某个元素的指针。在 ArrayList 的情况下,它是基础数组的索引。

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

一个迭代器一般都是做遍历一次的。在 Java 集合库中,如果在遍历迭代器期间对基础集合进行修改,类 将失败。

顺便说一句,这个问题可能更适合Programmers Stack Exchange,它专门用于理论编程问题。

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

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

如果迭代器方法是 Collection 接口的一部分,您将需要一些额外的方法来重置此 "built-in" 迭代器(以便从 Collection),并且在任何给定时间内,每个 Collection 都只有一个迭代器。像下面的代码片段一样简单的嵌套迭代是不可能的,因为它需要两个迭代器:

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

在概念层面:Collection 表示对象的集合。为 hasNextnext 添加方法会将它变成一个对象集合 以及 另一个状态,一个 'current object',以及一些如何遍历集合的概念。

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