2

我来自 C# 背景,其中迭代器实现IDisposable接口。Java中是否有任何迭代器实现了类似的接口,使它们自动关闭?

4

4 回答 4

7

Java 的 Iterator 只是用于迭代某些对象集合的抽象。如果底层数据结构在迭代后需要一些清理(例如关闭文件),那么您需要保留对该底层对象的引用,以便您可以做任何必须做的事情来“处理”它。

于 2012-08-20T10:48:41.750 回答
4

在 Java 7 中,您可以创建自己的迭代器(或一个装饰器),它也恰好实现了 AutoCloseable。然后您可以在 try 块中使用它:

try ( Iterator<MyObject> it = new MyAutoCloseableIterator(list) ) {
    while (it.hasNext()) {
       MyObject obj = it.next();
    }
}

在 try 块结束时,如果 Iterator 实现了 AutoCloseable 接口,“.close()”方法将自动调用它。

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

但是,我不相信任何内置迭代器(通常是集合的内部类,因此不公开可用)实现此接口。

另一种选择是(再次)编写您自己的迭代器,并在“.hasNext()”方法返回 false 时关闭资源。

于 2012-08-20T12:36:33.457 回答
1

在Java中,Iterator本身就是一个接口。而且它没有任何close()方法。

于 2012-08-20T10:45:30.593 回答
1

这是Iterator提供的 API

方法总结

boolean hasNext()
如果迭代有更多元素,则返回 true。E next()
返回迭代中的下一个元素。void remove()
从底层集合中移除迭代器返回的最后一个元素(可选操作)。

它旨在替换EnumerationJava 集合框架,并用于迭代集合。它基于Iterator设计模式。
它的目的正是所提供的。即迭代。close与等无关。
如果实现迭代器接口的类(例如Scanner )提供closethis 是ScannerAPI 的一部分。与迭代器方面/接口无关

于 2012-08-20T10:58:16.623 回答