You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jena.apache.org by "Andy Seaborne (JIRA)" <ji...@apache.org> on 2019/02/15 18:03:00 UTC

[jira] [Commented] (JENA-1601) Make ClosableIterator extend AutoCloseable

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