[ 
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)

Reply via email to