Если вы хотите реализовать Iterator
, который требует закрытия ресурса в конце итерации, вы должны инкапсулировать это в объект, реализующий Iterable
и AutoCloseable
.
Например, если вы обычно делаете:
for (MyObj obj : xxx.getSomeResource()) {
// code here
}
Затем измените код, чтобы вместо этого сделать это:
try (MyResource res = xxx.getSomeResource()) {
for (MyObj obj : res) {
// code here
}
}
Где MyResource
будет что-то вроде:
class MyResource implements AutoCloseable, Iterable<MyObj> {
private final LevelDBIterator levelDBIterator;
public MyResource(LevelDBIterator levelDBIterator) {
this.levelDBIterator = levelDBIterator;
}
@Override
public Iterator<MyObj> iterator() {
return /*code here*/;
}
@Override
public void close() throws Exception {
this.levelDBIterator.close();
}
}