Translate

quinta-feira, 31 de janeiro de 2013

Java 7 - Auto encerramento de recursos com novo try

Já comentei de algumas novidades do Java 7, mas não posso deixar de falar sobre o seu novo try capaz de gerenciar o encerramento automático de recursos.

Em versões anteriores ao Java 7, quando um recurso é construído e aberto (como ocorre com arquivos, conexões de banco de dados e sockets) algumas linhas de códigos a mais são necessárias para em caso de erro ainda garantir o fechamento adequado do recurso para não deixá-lo aberto ad eternum na memória do aplicativo.

Exemplo 1 - Teste do antigo try

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TestaOldTry {

    public static void main(String[] args) {

        FileReader fileReader = null;
        BufferedReader bufferReader = null;

        try {

            fileReader = new FileReader("c:/temp/datafile.txt");
            bufferReader = new BufferedReader(fileReader, 1024);

            String record = null;

            while ((record = bufferReader.readLine()) != null) {

                System.out.println(record);

            }     

        } catch(IOException e) {

            System.out.println(String.format("Falha ao ler arquivo: %s", e.getMessage()));

        } finally {

            if (bufferReader != null) {

                try {
                    bufferReader.close();
                } catch(IOException e) {
                    System.out.println("Falha ao fechar bufferReader: " + e.getMessage());
                }

            }

            if (fileReader != null) {

                try {
                    fileReader.close();
                } catch(IOException e) {
                    System.out.println("Falha ao fechar fileReader: " + e.getMessage());
                }

            }

        }

    }

}


Observe o cuidado e excessividade de códigos empregados para garantir o fechamento dos recursos bufferReader e fileReader no bloco finally.

Eis a novidade...

No Java 7 foi incorporado um try opcional para gerenciar automaticamente o encerramento de recursos. Para isso ocorrer, é necessário conferir se a classe do recurso implementa a nova interface java.lang.AutoCloseable ou a interface java.io.Cloaseable, senão o novo try não funciona logo na compilação. Este comportamento impede o programador para não se esquecer de programar um método de encerramento no recurso a ser automaticamente encerrado pelo novo try.

Agora vamos ver como fica a utilização do novo try, também conhecido por try-with-resources.

Exemplo 2 - Teste do novo try

public class TestaNewTry {

    public static void main(String[] args) {

        try (FileReader fileReader = new FileReader("c:/temp/datafile.txt");
                BufferedReader bufferReader = new BufferedReader(fileReader, 1024)) {

            String record = null;

            while ((record = bufferReader.readLine()) != null) {

                System.out.println(record);

            }     

        } catch(IOException e) {

            System.out.println(String.format("Falha ao ler arquivo: %s", e.getMessage()));

        }
    }

}


Este novo código revela um algoritmo bem menor e ainda traz o mesmo efeito do algoritmo do primeiro exemplo.

O objetivo com este novo try é certamente reduzir o número de códigos de sua programação Java para torná-la mais produtiva.

Até mais.

Nenhum comentário:

Postar um comentário