Java 为什么不';我们不把hasNext()、next()和其他方法放在集合接口中吗?
我对Java中的一个设计问题感到困惑。它在接口集合下实现了许多抽象容器,并提供了方法hasNext()和Next()以及类迭代器。如果我将这些方法直接放在接口集合下,然后在每个子类中重写它,有什么缺点: 例如,我已经意识到Next();类ArrayList下的hasNext()方法。所以我写的是Java 为什么不';我们不把hasNext()、next()和其他方法放在集合接口中吗?,java,oop,interface,Java,Oop,Interface,我对Java中的一个设计问题感到困惑。它在接口集合下实现了许多抽象容器,并提供了方法hasNext()和Next()以及类迭代器。如果我将这些方法直接放在接口集合下,然后在每个子类中重写它,有什么缺点: 例如,我已经意识到Next();类ArrayList下的hasNext()方法。所以我写的是 ArrayList ArrList=new ArrayList() if(ArrList.hasNext()) new obj=ArrList.next(); } 返回存储在列表中的对象 那么,
ArrayList ArrList=new ArrayList()
if(ArrList.hasNext())
new obj=ArrList.next();
}
返回存储在列表中的对象
那么,为接口集合引入迭代器类是多余的吗?设计ArrList.iterator()有什么好处;如果在界面中设置它更方便
我能找到一本书来解决这样的oop设计问题吗(正如计算机科学家所描述的)
谢谢您的时间。迭代器存储指向集合中某个元素的指针。在
ArrayList的情况下,它是底层数组的索引
它允许您在两个单独的线程中同时对集合进行迭代。如果指针是ArrayList的一部分,则每个线程都会跳过一些元素。迭代器通常被遍历一次。在Java集合库中,如果在遍历迭代器期间对基础集合进行修改,则类将失败
顺便说一句,这个问题可能更适合于理论编程问题。让我们假设ArrayList
确实有hasNext
和next
方法,因此您的代码可以编译。(您还需要另一种方法来告诉列表您希望重新开始。)这意味着我一次只能激活列表的一次迭代,因为列表本身包含迭代状态。那只是拙劣的设计;相反,我们有迭代器的概念,这样迭代的状态存储在迭代器中,而不是列表中,我们可以有多个迭代器。迭代器接口的方法(next()
,hasNext()
)不能简单地添加到接口中。迭代器具有一个状态,该状态确定迭代器将返回的下一个元素
如果迭代器方法是集合
接口的一部分,则需要一些额外的方法来重置此“内置”迭代器(以便从集合
开始再次迭代),并且在任何给定时间内,每个集合
都只有一个迭代器。像以下代码段这样简单的嵌套迭代是不可能的,因为它需要两个迭代器:
List<Integer> list = ...
for (int i : list)
for (int j : list)
System.out.println(i+j);
List=。。。
用于(int i:列表)
用于(int j:列表)
系统输出println(i+j);
在概念层面:集合
表示对象的集合。为hasNext
和next
添加方法将使其成为一个对象集合以及另一个状态片段“当前对象”,以及如何遍历集合的一些概念
因为这是两个独立的想法,所以最好将它们划分为独立实现的独立结构。在您提到的例子中,这将是集合
结构(它处理对象集合的存储和结构)和迭代器
结构(它处理某些对象集合的位置和遍历)。集合与迭代器非常不同,尽管它们彼此相关。阅读有关。例如,Collection
具有Set
子接口,如果它具有hasNext
则没有意义。您知道该代码块不会编译,对吗?因为ArrayList
实例没有hasNext
或next
。迭代器不是“多余的”,这就是迭代器的全部意义:为您提供一种遍历集合的方法。@Marounnaroun那么您的意思是我们必须保留迭代器才能为所有这些子接口提供服务?是的,这将是一个很好的阅读。是的,因此,我可以使用迭代器同时运行多个遍历列表的线程。这听起来很有意义!非常感谢。很遗憾,我能接受一个最好的答案。你的回答真的很有帮助,它真的帮助我更好地理解oop。非常感谢。我深深的感激!很遗憾,我可以接受一个最好的答案,所以我总结如下:(1)迭代器允许我们同时运行多个线程的横向转换。(2)迭代器也存储信息。关于接口中无法实现的当前指针(3),让我们阅读设计模式了解更多信息。谢谢大家帮我回答这个天真的问题。