Java 7: Try-with-resources ou Automatic Resource Management  XML
Índice dos Fóruns » Assuntos gerais (Off-topic)
Autor Mensagem
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Com o build 105 do Java 7, está disponível a sintaxe para fechar automaticamente arquivos ou outros recursos que precisem de tratamento especial para serem fechados.
Baixem o build em : http://download.java.net/jdk7/
Vejam o blog do Joseph Darcy, http://blogs.sun.com/darcy/
A spec está em: http://blogs.sun.com/darcy/entry/project_coin_updated_arm_spec
O Thingol postou um exemplo simples desse recurso.
http://thingol-guj.blogspot.com/2010/08/java-7-automatic-resource-management.html

Dá para fazer um exemplo mais elaborado.
Em resumo: o equivalente do seguinte recurso em C#, que chama automaticamente o "Dispose" (equivalente do método Java "close"):

é, em Java 7,

Para economizar palavras-chave, foi reusada a palavra-chave "try". Uma coisa que é um pouco diferente no Java em relação ao C# é que esse try continua a ter o "catch" e o "finally", então você pode ao mesmo tempo fechar o arquivo e tratar as exceções, tudo dentrodo mesmo try/catch/finally.
Uma coisa meio chata é que a classe deve implementar AutoCloseable, mas as classes do JDBC não implementam AutoCloseable apesar de o Darcy ter insistido bastante com o time do JDBC. Parece que a spec do JDBC para o Java 7 está fechada há tempos...

This message was edited 3 times. Last update was at 24/08/2010 13:26:00



[WWW]
Andre Brito
JWizard

Membro desde: 21/07/2007 17:44:31
Mensagens: 2485
Localização: Paraná
Offline

Aposto que vai confundir muita gente esse try com catch e finally opcionais!

Só não vi muita vantagem nisso... Não consegui entender o porque de eu não querer tratar a exception na hora de fechar o arquivo (ou coisa do tipo).

Como organizar o GUJ.
Meu Twitter.
Meu blog.
Future proofing means making code easy to change, not trying to anticipate every possible way your code might need to change.
[WWW]
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Online

show de bola.

www.citrox.com.br
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Vou copiar o exemplo do Thingol, e então postar o exemplo equivalente em Java 6.


juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Online

Andre Brito wrote:Aposto que vai confundir muita gente esse try com catch e finally opcionais!

Só não vi muita vantagem nisso... Não consegui entender o porque de eu não querer tratar a exception na hora de fechar o arquivo (ou coisa do tipo).


A idéia é que o io só existe dentro do scopo, ou seja dentro do try. Isso evita erros gerados quando não se desalocam recursos, como memory leaks.
Idéia muito boa essa interface AutoCloseable.

www.citrox.com.br
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Online

entanglement wrote:Vou copiar o exemplo do Thingol, e então postar o exemplo equivalente em Java 6.




Estou baixando a nova release.
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Note várias coisas.

a) O try-with-resources sempre fecha direitinho os arquivos (não preciso usar esse truque de inicializar a variável com null, usar um finally, e então sufocar a eventual exceção gerada pelo close com esses try/catchs dentro do finally.
b) Diferentemente do C# (onde só posso fazer uma declaração dentro do using), posso pôr várias declarações dentro do try(). Elas indicarão também a ordem de encerramento ( se você abrir os arquivos em uma determinada ordem, eles serão fechados em ordem inversa).
c) Você pode tratar várias exceções em um mesmo catch, se elas forem compatíveis entre si. Basta usar "final" e "|" para separar os nomes das classes.
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Como foi apontado pelo Thingol, infelizmente as classes e interfaces de java.sql.* não implementam AutoCloseable*, portanto não posso usar o mesmo truque com um ResultSet ou uma Connection. Provavelmente alguém irá criar um "wrapper" para essas interfaces que implemente AutoCloseable, só para poder usar o "try-with-resources".

* Provavelmente porque, devido ao fato de o JDBC envolver cooperação dos fornecedores de drivers, ficaria um pouco inviável, já que a spec foi fechada há tempos, reabrir a spec e forçar os fornecedores a atualizarem suas implementações. Isso é diferente, por exemplo, do java.io.*, cujo único fornecedor é a Sun/Oracle nesse caso.

Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline

Boa, mas a interface podia se chamar simplesmente Closable.

Isso tudo são syntax-sugars ou realmente ouve alguma mudança na estrutura dos programas em Java?

Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

Achei muito legal, só não gostei da sintaxe.

[]´s

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

Marky.Vasconcelos wrote:Boa, mas a interface podia se chamar simplesmente Closable.


Não concordo. Pq o fechamento é automático e a interface tem que denotar exatamente, ao meu ver, o comportamento de quem a implementa.
Closable fica muito genérico. Afinal, as classes já são Closable.

[]´s

This message was edited 2 times. Last update was at 24/08/2010 14:23:25


Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Marky.Vasconcelos wrote:Boa, mas a interface podia se chamar simplesmente Closable.

Isso tudo são syntax-sugars ou realmente houve alguma mudança na estrutura dos programas em Java?


Já existe uma interface Closeable:

http://download-llnw.oracle.com/javase/6/docs/api/java/io/Closeable.html

A Closeable, no Java 7, irá estender Autocloseable.

O que o Darcy não conseguiu é que as classes e interfaces do JDBC que tèm um método close() implementassem Autocloseable. (A propósito, elas também não implementam java.io.Closeable, principalmente porque a interface java.io.Closeable tem um método close que lança a exceção IOException, e o close do JDBC lança SQLException.

O close do Autocloseable irã lançar simplesmente Exception, o que é permitido pelo Java (você, ao estender uma interface, pode redefinir o método lançando uma exceção mais específica - por exemplo, se Autocloseable lança Exception, java.io.Closeable pode lançar IOException, e java.sql.Closeable (uma interface que não existe, aliás) poderia lançar SQLException, sem problemas.

Voltando à vaca fria: é claro que é um syntax sugar. Mas que economiza um bocado de esforço e ajuda a tornar seus programas mais corretos, ajuda.


[WWW]
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline

PS: Thingol, seu blog é muito preto e cinza, é dificil ver as coisas. Foi pra economizar energia?

Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
mochuara
GUJ Master
[Avatar]
Membro desde: 20/05/2009 11:21:32
Mensagens: 1776
Offline

entanglement wrote:Vou copiar o exemplo do Thingol, e então postar o exemplo equivalente em Java 6.




O equivalente em Clojure:

Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

A espera foi grande, mas parece que teremos uma boa gama de features novas, sem contar as closures.

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
 
Índice dos Fóruns » Assuntos gerais (Off-topic)
Ir para:   
Powered by JForum 2.1.8 © JForum Team