Closures - exemplo de uso

Quando o Java 7.0 (ou talvez o Java 8.0, quem sabe :frowning: ) for lançado, talvez ele implemente um recurso de Closures.
Houve uma discussão aqui no GUJ, mas para quem quer ver um exemplo disso funcionando (é claro que ainda não foi implementado na linguagem :stuck_out_tongue: ) pode vê-lo aqui.
Aqui temos um exemplo de como podemos implementar o recurso do C# (muito útil, por sinal) chamado "using" com pouquíssimas linhas de Java.

import java.io.*;
import java.sql.*;
import static java.util.Algorithms.*;

// Exemplo de uso de Closures, tal como proposto em:
// http://www.javac.info/closures-v03.html
class Test {
    public static void main(String[] args) throws IOException, SQLException {
        byte[] buffer = new byte[8192];
        
        // Copiando um arquivo para outro - veja, não preciso 
        // chamar "close" explicitamente! 
        using (InputStream in: new FileOutputStream (args[0])) {
            using (OutputStream out: new FileOutputStream (args[1]) {
                 int nBytes;
                 while ((nBytes = in.read(buffer)) &gt 0) {
                     out.write (buffer, 0, nBytes);
                 }
            }
        }
        
        // Usando JDBC - note que não preciso escrever todo aquele código 
        // enfadonho (e que muitas vezes é escrito errado) 
        // só para encerrar as conexões. 
        using (Connection conn = blablabla) {
            using (ResultSet rset = blablabla) {
            }
        }
    }
}
package java.util;
import java.io.Closeable;
import java.io.IOException;

public class Algorithms {
    /**
     * Uma "closure" que imita o comportamento da palavra-chave "using"
     * do C#.
     * @param block O bloco de código onde devemos executar o método "close" sobre
     * a variável definida neste bloco. 
     * @param t A variável definida neste bloco.                 
     * @param <T> O tipo da variável definida neste bloco.
     * @param <E> O tipo da exceção lançada por este bloco.
     */    
    <T extends Closeable, throws E>
    public static void using ({T=&gtvoid} throws E block, T t) throws E {
        try {
            block.invoke();
        } finally {
            try { t.close(); } catch (IOException ex) { }
        }
    }
}