Proposal: Automatic Resource Management

Mark Mahieu markmahieu at googlemail.com
Wed Mar 4 05:36:34 PST 2009


Josh,

Yeah, sorry that email was a bit rubbish.  It was 3:30am though -  
please allow me to try again...

As you know some resources are allocated and held for much longer  
than the duration of a single method call, eventually being released  
on some trigger condition.  I'm not suggesting that ARM should try to  
cater for this, but I do see Neal's point that there's a common  
desire to pass such resources around or to hold them somewhere, and  
given that they are often the same *type* in both scenarios, then if  
ARM introduced the Disposable interface for its purposes, it would be  
natural for programmers to want to hold the more long-lived ones in a  
Collection<Disposable> for later disposal.

Now, where I was going with my last email was that a library could  
include an interface that extends Disposable, refining the exception  
types thrown:

interface SWTDisposable extends Disposable {
	void close() throws SWTException;
}

The afore-mentioned programmer could now hold a  
Collection<SWTDisposable> and have much more appropriate exception  
types to deal with in their cleanup code.  (SWTException is unchecked  
in real life, but the point's the same).

If that turned out to be a sensible convention, then the only  
responsibility for ARM would be to say, in the javadoc for  
Disposable, "libraries are encouraged to extend this interface,  
refining the thrown exceptions...".


Now, having mentioned SWT...

This fairly typical example, from the official SWT 'snippets' page,  
would benefit very well from the introduction of ARM or some other  
resource disposal mechanism:

http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/ 
org/eclipse/swt/snippets/Snippet280.java?view=co


So if we look at how the SWT library might be retrofitted to work  
with ARM, we find this class, which is extended by all the various  
SWT resource classes:

public abstract class Resource {

	/**
  	 * Disposes of the operating system resources associated with this  
resource.
	 */
	void dispose() {
		// ...
	}

	// ...
}

http://help.eclipse.org/stable/nftopic/org.eclipse.platform.doc.isv/ 
reference/api/org/eclipse/swt/graphics/Resource.html


OK, well for once the SWT team's aversion to interfaces has an up- 
side, and we can easily retrofit this with Disposable, calling dispose 
() from close().  Or can we?

public class Path extends Resource {

	/**
	 * Closes the current sub path by adding to the receiver a line from  
the current point of the path back to the starting point of the sub  
path.
	 */
	public void close() {
		// ...
	}

	// ...
}

http://help.eclipse.org/stable/nftopic/org.eclipse.platform.doc.isv/ 
reference/api/org/eclipse/swt/graphics/Path.html


Square peg, round hole :(


Any suggestions?


Regards,

Mark



On 4 Mar 2009, at 03:47, Joshua Bloch wrote:

> Mark,
>
> I don't see a compelling need for it. When in doubt, leave it out.
>
>             Josh
>
> On Tue, Mar 3, 2009 at 7:39 PM, Mark Mahieu  
> <markmahieu at googlemail.com> wrote:
> So would APIs be encouraged to define more specific Resource
> interfaces that narrow the thrown exception types ...
>
> interface SQLResource extends Resource {
>        void dispose() throws SQLException { }
> }
>
> interface SWTResource extends Resource {
>        void dispose() throws SWTException { }
> }
>
> etc?
>
> I don't think there'd be any reason to do this.




More information about the coin-dev mailing list