在增强的for循环中使用类

时间:2013-10-19 21:29:34

标签: java

我编写了一个实现Collection和Iterable的类,我试图通过增强的for循环来运行它。您可以在此处找到它:LinkedQueue

该类的要点是能够使用LinkedQueue.getNext()完成集合,这可以正常工作。但是我也希望能够使用for循环迭代值一次。目前的代码:

LinkedQueue<String> queue = new LinkedQueue();
queue.add("Test one");
queue.add("Test two");
queue.add("Test three");
System.out.println("queue.size = " + queue.size());
System.out.println("contents:");
for (String s : queue) {
    System.out.print("Test: ");
    System.out.println(s);
}
System.out.println("contents (x9):");
for (int i = 0; i < 9; i++) {
    System.out.println(queue.getNext());
}

打印出来:

queue.size = 3
contents:
contents (x9):
Test one
Test two
Test three
...etc...

所以似乎for循环打印不正确。我不认为这是一个大小问题,因为队列在开始之前的大小为3。所以现在我的问题很可能是“可迭代方法有什么问题”,它们是hasNext()next()remove()(在此队列中不受支持)。我做错了什么?

1 个答案:

答案 0 :(得分:3)

您的实现失败,因为当您(隐式)调用iterator()时,您的itr变量仍然只引用“空值”节点。您只能将其设置为next()方法中的任何其他值,直到稍后才会调用。

然而,存在更严重的设计问题。从根本上说,一个集合几乎不应该实现iterator()本身。您通常应该能够多次遍历集合 - 可能同时使用多个迭代器,这些迭代器都应该是独立的。迭代集合不应该改变它。

目前还不完全清楚你要实现的目标,但iterator()实现应该几乎总是创建一个具有一些可变状态的 new 对象,引用到原始集合但不改变它。