为什么java Iterator接口应该实现为内部类?

时间:2013-04-18 16:52:02

标签: java iterator inner-classes

我最近读了一本书“The Java Tutorials”第3版。 它如图所示讨论了内部类的实现。

在第3段中,它说“Stack类本身不应该实现Iterator接口,因为......”。

我找不到Stack类不应该实现Iterator的任何原因。给出的理由不是透彻的。

你能解释一下吗?

Inner class Inner class

5 个答案:

答案 0 :(得分:9)

从根本上说,迭代器是有状态的 - 它需要知道它指向集合中的。这不属于集合本身的一部分 - 给出的解释是正确的......完全有可能有两个独立的迭代器对象,遍历同一个集合对象。如果集合本身实现了Iterator接口,您将如何建模?它是可能的(例如,创建一个新的集合实例,而这个实例又包含对原始集合的引用),但它真的很难看。

这里有一些不同的问题:

  • 数据收集
  • 位于集合
  • 中的光标

单独关注=>单独的课程。

说服自己的最简单方法可能是尝试实现自己的集合 - 然后有多个迭代器。例如,您可能想尝试:

List<String> foo = new MyListImplementation<String>();
foo.add("a");
foo.add("b");

// The enhanced for loop uses Iterable/Iterator for non-arrays
for (String x : foo) {
    for (String y : foo) {
        System.out.println(x + " " + y);
    }
}

打印出来:

a a
a b
b a
b b

尝试在没有两个课程的情况下实施它,并了解你的工作方式,牢记问题的分离。

答案 1 :(得分:4)

堆栈不应该实现Iterator本身,因为那样一次只能有一个迭代器,迭代堆栈会改变堆栈。

对于后一个问题,请注意嵌套类具有“currentItem”字段。该字段需要在“Stack”中,并且在调用next()时会改变。迭代集合不应该改变集合。

第一个问题更严重:假设有两个人在堆栈上迭代(或者一个方法希望在堆栈上创建两个迭代器)。然后,如果iterator()返回this,则两个迭代器将是相同的。在一个上调用next()会移动另一个。混沌。

答案 2 :(得分:2)

Stack不能是它自己的Iterator,因为Stack支持多个Iterator。

您可能希望多次迭代Stack。这些迭代可能在不同的时间发生,甚至可能在同一时间发生。同时多次迭代显然需要多个对象。在不同时间进行多次迭代需要多个对象,因为Iterator接口不支持返回到开始。

答案 3 :(得分:1)

我有两个理由可以想到我的头脑。

多个类型的迭代器

您可能需要以不同方式迭代的多种类型的迭代器。例如,Forward Iterator和Backward Iterator(从容器的末尾迭代到开始)。

迭代器的多个实例

如果你有一个多遍算法和/或嵌套循环,每个循环可能需要它自己的迭代器,它跟踪它在容器中的位置,与其他迭代器无关。


使用Iterator类中实现的Stack接口支持这些功能即使不是不可能也很困难。

答案 4 :(得分:0)

只是添加到讨论中,内部类将可以访问Stack类的私有数据,因此以这种方式,Stack类将设法处理客户端程序员一个对象或多个对象(迭代器(s) ),仍然这些对象将能够访问该类并在集合上提供单独的迭代。