Proposal: Automatic Resource Management

Sean R. Drucker sean.drucker at frameworkplus.com
Tue Sep 1 19:32:39 PDT 2009


My suggestion was assuming an implementation like (2).  Here is a use case:

interface SQLIterator<E> extends Iterator<E>, Disposable<SQLException> {
}

interface SQLTable extends Iterable<Row> {
     SQLIterator<Row> iterator();
}

Current usage pattern:

public static void current(SQLTable table) throws SQLException {
     final SQLIterator<Row> itr = table.iterator();
     try {
         while (itr.hasNext()) {
             final Row row = itr.next();
             ...
         }
     } finally {
         itr.close();
     }
}

Equivalent using Automatic Resource Management:

public static void arm(SQLTable table) throws SQLException {
     for (final Row row: table) {
        ...
     }
}

The specification added to Disposable would be something like:

If an implementation of Iterable<E>.iterator() returns a static type 
that extends both Iterator<E> and Disposable<X> (which is possible due 
to covariance), then when an instance of that Iterable is used in a 
for-each loop, the Iterable.iterator() will always have its 
Disposable.close() method called after iteration is complete or 
terminated (either an early return or an iteration exception).  Any 
checked exception X thrown from Disposable.close() will need to be 
caught or rethrown and will suppress any prior iteration exception.

Suppressing exceptions seems reasonable as that is what is done in the 
current usage pattern.  Also, as a practical matter, if a close() method 
was ever to throw an exception (which is highly rare), it would indicate 
a far greater problem (usually a lost resource connection) than any 
problem in the iteration.

Thanks... Sean

Neal Gafter wrote:
> On Tue, Sep 1, 2009 at 4:24 PM, Rémi Forax <forax at univ-mlv.fr 
> <mailto:forax at univ-mlv.fr>> wrote:
> 
>     This will require to introduce a new interface IterableDisposable or
>     something like that to ease the use of such pattern.
> 
> 
> That's one way to do it.  Here are two others:
> 
>  1. Dynamically test the type of the iterator to see if it extends 
> Disposable.
> 
>  2. Statically test the static return type of 
> iterableExpression.iterator(), which due to covariance may be a type 
> that extends both Iterable<?> and Disposable.
> 
> I think (2) works best, so that the compiler can see the exceptions 
> statically thrown by iterableExpression.iterator().close() and the 
> programmer won't have to catch(Exception).
> 
> Cheers,
> Neal
> 



More information about the coin-dev mailing list