【问题标题】:Why don't we put the hasNext(), next() and other methods in Collection interface?为什么不把hasNext()、next()等方法放在Collection接口中呢?
【发布时间】:2015-03-31 10:10:30
【问题描述】:

我对 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() 有什么好处;如果在界面中设置更方便?

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

感谢您的宝贵时间。

【问题讨论】:

  • 集合与迭代器有很大不同,尽管两者是相互关联的。阅读iterator pattern
  • 比如CollectionSet子接口,如果有hasNext就没意义了。
  • 你明白那个代码块不会编译,对吧?因为ArrayList 实例没有hasNextnext。迭代器不是“冗余的”,这是迭代器的全部意义:为您提供一种通过集合迭代的方法。
  • @MarounMaroun 所以你的意思是我们必须保留迭代器才能为所有这些子接口提供服务?
  • 是的,这将是一个很好的阅读。

标签: java oop interface


【解决方案1】:

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

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

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

【讨论】:

  • 很遗憾我能接受一个最佳答案,所以我在下面做了一个总结:(1)迭代器允许我们同时运行多个线程的遍历。(2)迭代器也存储信息。关于在接口中无法实现的当前指针(3)让我们阅读设计模式了解更多信息。感谢大家帮助我解决这个幼稚的问题。
【解决方案2】:

迭代器存储指向集合内某个元素的指针。对于ArrayList,它是底层数组的索引。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 是的,所以我可以使用迭代器同时运行多个遍历列表的线程。听起来很有意义!谢谢!
      • 很遗憾只能接受一个最佳答案。你的回答真的很有帮助,它真的帮助我更好地理解 oop。谢谢!深表谢意!
      【解决方案5】:

      在概念级别:Collection 表示对象的集合。为hasNextnext 添加方法将把它变成一个对象集合以及另一个状态,一个“当前对象”,以及一些如何遍历集合的概念。

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

      【讨论】:

        猜你喜欢
        • 2011-04-07
        • 2012-07-06
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 2011-08-07
        • 2020-12-30
        • 1970-01-01
        相关资源
        最近更新 更多