我对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()有什么好处;如果在界面中设置它更方便吗?
我能找到任何书来解决这种设计问题吗(正如计算机科学家所描述的那样)?
感谢您的时间。
答案 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
确实有hasNext
和next
方法,因此您的代码会编译。 (你还需要另一种方法来告诉列表你想重新开始。)这意味着我一次只能激活列表的一次迭代,因为列表本身包含迭代状态。这只是糟糕的设计;相反,我们有Iterator
概念,因此迭代的状态存储在 iterator 中,而不是列表中,我们可以有多个迭代器。
答案 4 :(得分:1)
在概念层面:Collection
代表一组对象。为hasNext
和next
添加方法会将其转换为对象的集合以及另一个州,一个&#39;当前对象&#39;以及关于如何遍历集合的一些概念。
由于这是两个独立的想法,因此最好将它们分成独立实施的独立结构。在你说的情况下,那将是Collection
结构(处理对象集合的存储和结构),以及Iterator
结构(处理某些对象集合的位置和遍历)