[
https://issues.apache.org/jira/browse/JENA-1601?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16769553#comment-16769553
]
Andy Seaborne commented on JENA-1601:
-------------------------------------
A possibility is to add these two default methods to ExtendedIterator:
{code}
/**
* Execute an action on each element of this ExtendedIterator.
* The iterator is consumed and closed by this call.
*/
public default void loop( Consumer<T> action ) {
try {
while(hasNext())
action.accept(next());
} finally { close(); }
}
/**
* Execute an action on this ExtendedIterator, wrapped in a
try-finally-close construct.
* The iterator processing code can throw exceptions or return early.
* The iterator is closed by this call.
*/
public default void process( Consumer<ExtendedIterator<T>> iteratorLoop ) {
try {
iteratorLoop.accept(this);
} finally { close(); }
}
{code}
This is a soft approach to having auto-closeable behaviour - it won't trigger
all application code getting IDE warnings.
> Make ClosableIterator<T> extend AutoCloseable
> ---------------------------------------------
>
> Key: JENA-1601
> URL: https://issues.apache.org/jira/browse/JENA-1601
> Project: Apache Jena
> Issue Type: Improvement
> Components: Jena
> Affects Versions: Jena 3.8.0
> Reporter: David Schwingenschlögl
> Assignee: Andy Seaborne
> Priority: Minor
>
> The interface org.apache.jena.util.iterator.ClosableIterator<T> defines a
> method public void close(), so the concept of closing is already baked into
> it. The only barrier to using a ClosableIterator (and thus, ExtendedIterator)
> in a try-with-resource block is the missing extension of
> java.lang.AutoCloseable.
> According to API documentation of ClosableIterator, an iterator should be
> closed when not completely exhausted, which may be the case when the block
> consuming the iterator throws an exception, effectively making constructs
> such as this necessary:
> {code:java}
> final ExtendedIterator<Triple> iterator = someGraph.find();
> try {
> while (iterator.hasNext()) {
> // consume iterator, might throw in here
> }
> } finally {
> // Prevent resource leaks
> iterator.close();
> }
> {code}
> This would be better expressed in a try-with-resource-construct:
> {code:java}
> try (final ExtendedIterator<Triple> itrator = someGraph.find()) {
> // consume iterator, might throw in here
> }
> {code}
> From what I can tell, making a ClosableIterator also extend AutoCloseable
> only adds to the usability of Jena's API while keeping source backwards
> compatibility intact.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)