为什么不把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
确实有 hasNext
和 next
方法,因此您的代码可以编译。 (您还需要另一种方法来告诉列表您想要重新开始。)这意味着我一次只能激活列表的 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
表示对象的集合。为 hasNext
和 next
添加方法会将它变成一个对象集合 以及 另一个状态,一个 'current object',以及一些如何遍历集合的概念。
由于这是两个独立的想法,所以最好将它们分成单独的结构,独立实现。在您所说的情况下,这将是 Collection
结构(处理对象集合的存储和结构)和 Iterator
结构(处理某些对象集合的位置和遍历) .
我对 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
确实有 hasNext
和 next
方法,因此您的代码可以编译。 (您还需要另一种方法来告诉列表您想要重新开始。)这意味着我一次只能激活列表的 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
表示对象的集合。为 hasNext
和 next
添加方法会将它变成一个对象集合 以及 另一个状态,一个 'current object',以及一些如何遍历集合的概念。
由于这是两个独立的想法,所以最好将它们分成单独的结构,独立实现。在您所说的情况下,这将是 Collection
结构(处理对象集合的存储和结构)和 Iterator
结构(处理某些对象集合的位置和遍历) .