JavaRush /Blogue Java /Random-PT /Java 7 teste com recursos
DarthVictor
Nível 28

Java 7 teste com recursos

Publicado no grupo Random-PT
A partir da versão 7, Java oferece gerenciamento aprimorado de recursos que devem ser fechados após terminar de trabalhar com eles. Tais recursos incluem, por exemplo, arquivos, fluxos, conexões de banco de dados e soquetes. Esse propósito é atendido por uma construção de linguagem especial try-with-resources. Para que este fechamento automático funcione, foi criada uma interface especial AutoCloseable. Java 7 tentativa com recursos - 1No Java 7, todas as classes de recursos implementam esta interface. Sua assinatura é assim:
public interface AutoCloseable {
    void close() throws Exception;
}
A interface declara um método close()que é chamado automaticamente nos objetos servidos pela construção try-with-resources. Embora as classes de recursos no Java 7 implementem essa interface, muitas das bibliotecas que você usa não o fazem, porque a biblioteca ainda não foi atualizada para funcionar com a interface AutoCloseable ou você simplesmente não tem a oportunidade de atualizar a biblioteca. Na maioria dos casos isso pode ser facilmente resolvido. Herde a classe de recursos que deve participar do try-with-resources. Vejamos por exemplo ITextRenderer(do projeto Flying Saucer). Depois de terminar de trabalhar com ITextRenderer, o método deve ser chamado finishPDF(). Normalmente você faria isso em um bloco finally. Mas quando você cria uma nova classe que estende ITextRenderere implementa a interface AutoCloseable, você pode incluí-la no arquivo try-with-resources. A nova classe AutoCloseableITextRendererficará assim:
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
    @Override
    public void close() {
        super.finishPDF();
    }
}
Estender a classe original em um descendente é a solução mais razoável, já que a nova classe ainda será ITextRenderer. Caso a classe original seja declarada como final, deverá ser utilizada composição. E é assim que o uso seria:
try (final AutoCloseableITextRenderer iTextRenderer = new AutoCloseableITextRenderer()) {
            ByteArrayOutputStream out; // contains the data to be converted to PDF, not shown here.
            iTextRenderer.setDocumentFromString(new String(out.toByteArray()));
            iTextRenderer.layout();
            iTextRenderer.createPDF(pdfOutputStream);
            pdfOutputStream.flush();
        }
Isso é tudo. Observe que não lancei uma exceção de um método close()no arquivo AutoCloseableITextRenderer. O Javadoc da interface AutoCloseablediz o seguinte sobre isso: Embora o método da interface seja declarado para lançar exceções Exception, os implementadores deste método são fortemente recomendados a usar classes de exceção mais específicas ao implementar o método, ou a não lançar exceções se o método close()não puder falhar.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION