У меня была похожая проблема в одном из моих проектов с использованием итератора, подобного потоку объектов.Чтобы охватить время, когда итератор используется не полностью, мне также понадобился метод close.Первоначально я просто расширил интерфейсы Iterator и Closable, но немного углубившись в оператор try-with-resources, представленный в Java 1.7, я подумал, что предоставил удобный способ его реализации.
Вы расширяете интерфейсы Iterator и AutoCloseable,реализовать метод Close и использовать итератор в try-with-resources.Среда выполнения вызовет для вас закрытие, как только Итератор выйдет из области видимости.
https://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
Например,
Интерфейс:
public interface MyIterator<E> extends Iterator<E>, AutoCloseable {
}
Реализация этого: `public class MyIteratorImpl реализует MyIterator {
private E nextItem = null;
@Override
public boolean hasNext() {
if (null == nextItem)
nextItem = getNextItem();
return null != nextItem;
}
@Override
public E next() {
E next = hasNext() ? nextItem : null;
nextItem = null;
return next;
}
@Override
public void close() throws Exception {
// Close off all your resources here, Runtime will call this once
Iterator out of scope.
}
private E getNextItem() {
// parse / read the next item from the under laying source.
return null;
}
}`
И пример использования его с try -with-ресурс:
`открытый класс MyIteratorConsumer {
/**
* Simple example of searching the Iterator until a string starting
* with the given string is found.
* Once found, the loop stops, leaving the Iterator partially consumed.
* As 'stringIterator' falls out of scope, the runtime will call the
* close method on the Iterator.
* @param search the beginning of a string
* @return The first string found that begins with the search
* @throws Exception
*/
public String getTestString(String search) throws Exception {
String foundString = null;
try (MyIterator<String> stringIterator = new MyIteratorImpl<>()) {
while (stringIterator.hasNext()) {
String item = stringIterator.next();
if (item.startsWith(search)) {
foundString = item;
break;
}
}
}
return foundString;
}
}`