On 10/9/2013 12:08 PM, Jim Janney wrote:
Thanks. But that looks like a good idiom to avoid. I prefer
MyResource r1 = openResource();
try {
MyResource r2 = openResource2();
try {
// do something
} finally {
r2.close();
}
} finally {
r1.close();
}
Not as pretty syntactically, perhaps, but much clearer semantically.
I don't like either one. Why not take advantage of the fact that
resources are specified to be closed in the opposite order that they
are declared in a try-with-resources?
The following demonstrates this by closing the named streams in the
order C-B-A:
package quicktest;
import java.io.IOException;
import java.io.InputStream;
public class TryResourcesTest
{
public static void main( String[] args ) throws Exception
{
try(
MyTestStream a = new MyTestStream( "A" );
MyTestStream b = new MyTestStream( "B" );
MyTestStream c = new MyTestStream( "C" )
) {
System.out.println( a.read()+b.read()+c.read() );
}
}
}
class MyTestStream extends InputStream {
private final String name;
public MyTestStream( String name ) {
this.name = name;
}
@Override
public int read() throws IOException {
return 42;
}
@Override
public void close() {
System.out.println( getClass().getSimpleName()+
":"+name+" closed." );
}
}
Yes, in Java 7 you can have clean syntax and clean semantics. Looks
like a win all around.