Java 7: Try-with-resources ou Automatic Resource Management

[quote=Bruno Laturner]
Mas sério, não vou ficar brincando de a-minha-api-padrão-é-melhor-que-a-sua.[/quote]

Até porque não existe o equivalente na API padrão do Java.

Acho que ele só postou esse exemplo de cópia de arquivos por ser bem simples de entender. Ele já postou, por exemplo, como é que se copia um arquivo com java.nio, por exemplo, que é claramente mais rápido que com Buffered*Stream.

É pena que a especificação do Projeto Lambda não está muito fechada, e você ainda não possa baixar uma versão funcional do site (você precisa baixar os fontes você mesmo e fazer você mesmo a compilação do JDK, o que não é nada muito trivial. ) Não é o “closures” do Neal Gafter (que não envolvia mudar a própria JVM).

O Projeto Lambda, que é uma modificação bem tímida da linguagem a meu ver, vai permitir algumas coisas que ainda não são possíveis em Java.

[quote=entanglement]Acho que ele só postou esse exemplo de cópia de arquivos por ser bem simples de entender. Ele já postou, por exemplo, como é que se copia um arquivo com java.nio, por exemplo, que é claramente mais rápido que com Buffered*Stream.

É pena que a especificação do Projeto Lambda não está muito fechada, e você ainda não possa baixar uma versão funcional do site (você precisa baixar os fontes você mesmo e fazer você mesmo a compilação do JDK, o que não é nada muito trivial. ) Não é o “closures” do Neal Gafter (que não envolvia mudar a própria JVM).

O Projeto Lambda, que é uma modificação bem tímida da linguagem a meu ver, vai permitir algumas coisas que ainda não são possíveis em Java.
[/quote]

Dependendo do tamanho do arquivo lido a diferença entre NIO e IO é irrelevante, e em operações maiores eu não afirmaria com tanta certeza, pelo menos sem saber qual o modelo de threads utilizado.


Bom post Thigol,

na revista JavaMagazine desde mês (ed. 82) foi publicada um artigo do Osvaldo Doederlein) sobre esse mesmo assunto, aos interessados recomendo a leitura.

Esse recurso, pelo que entendi é chamado de “Automatic Resource Management - ARM” e aparentemente tem impacto apenas na “verbosidade” do Java.

Os defensores dessa coisa, reclamam de fazer isso em um bloco finally:

if (bis != null) try { bis.close(); } catch (IOException ex) {} if (bos != null) try { bos.close(); } catch (IOException ex) {}

Como se ninguém tivesse escrito classes utilitárias para evitar os catch vazios esparramados pelo código. Eu uso assim:

FileUtils.close(bis); FileUtils.close(bos);

Com relação aos outros aspectos das novidades, eu ainda estou avaliando (risos).

fw

[quote=Dieval Guizelini]Bom post Thigol,

na revista JavaMagazine desde mês (ed. 82) foi publicada um artigo do Osvaldo Doederlein) sobre esse mesmo assunto, aos interessados recomendo a leitura.

Esse recurso, pelo que entendi é chamado de “Automatic Resource Management - ARM” e aparentemente tem impacto apenas na “verbosidade” do Java.

Os defensores dessa coisa, reclamam de fazer isso em um bloco finally:

if (bis != null) try { bis.close(); } catch (IOException ex) {} if (bos != null) try { bos.close(); } catch (IOException ex) {}

Como se ninguém tivesse escrito classes utilitárias para evitar os catch vazios esparramados pelo código. Eu uso assim:

FileUtils.close(bis); FileUtils.close(bos);

Com relação aos outros aspectos das novidades, eu ainda estou avaliando (risos).

fw[/quote]

Com certeza. Eu não considero como sintaxe sugar, pelo fato de realmente ser muito útil. Como citado eu precisaria de um finally para liberar os recursos, pois a vida deles se estende além do escopo mostrado acima. Dessa maneira o próprio ciclo de vida delas se encarrega de libera-los para mim.

Está acontecendo com o Java e C# o mesmo que aconteceu com o Delphi e VB: a MS lança uns recursos que atendem 0,001% de melhoria na produtividade e sai com um marketing de que possui o recurso e o outro não. Daí a outra empresa corre e implementa também, mesmo que na prática pouquíssima gente vai usar e que ajuda muito pouco no produto final.

Chega uma hora que as duas linguagens vão ficar tão cheias de recursos quase inúteis que vão ficar pesadonas, enormes e confusas, gerando códigos idem. Até que surja uma nova onda e comece tudo de novo.

Alguém sabe dizer se o MigLayout vai entrar na versão final?

[quote=marcosalex]Está acontecendo com o Java e C# o mesmo que aconteceu com o Delphi e VB: a MS lança uns recursos que atendem 0,001% de melhoria na produtividade e sai com um marketing de que possui o recurso e o outro não. Daí a outra empresa corre e implementa também, mesmo que na prática pouquíssima gente vai usar e que ajuda muito pouco no produto final.

Chega uma hora que as duas linguagens vão ficar tão cheias de recursos quase inúteis que vão ficar pesadonas, enormes e confusas, gerando códigos idem. Até que surja uma nova onda e comece tudo de novo.[/quote]

É o ciclo da vida :slight_smile:

Antes de comentarem se gostaram ou não, vamos combinar uma coisa: o Java 7 é uma lenda urbana! Está no mesmo nível de Duke Nukem Forever e Chinese Democracy. De quando e quando, sempre lançam uma espécie de “novas features do Java 7”, mas esquecem que não há JSR, não há apoio (e com razão) da Apache e, possivelmente, do Google, e não há mais a aparente benevolência da Sun.

Talvez um dia saia, mas é de um futuro tão incerto que me faz pensar: pra que se preocupar tanto?

[quote=marcosalex]Está acontecendo com o Java e C# o mesmo que aconteceu com o Delphi e VB: a MS lança uns recursos que atendem 0,001% de melhoria na produtividade e sai com um marketing de que possui o recurso e o outro não. Daí a outra empresa corre e implementa também, mesmo que na prática pouquíssima gente vai usar e que ajuda muito pouco no produto final.

Chega uma hora que as duas linguagens vão ficar tão cheias de recursos quase inúteis que vão ficar pesadonas, enormes e confusas, gerando códigos idem. Até que surja uma nova onda e comece tudo de novo.[/quote]

como uma linguagem fica pesada?

[quote=Leonardo3001]Antes de comentarem se gostaram ou não, vamos combinar uma coisa: o Java 7 é uma lenda urbana! Está no mesmo nível de Duke Nukem Forever e Chinese Democracy. De quando e quando, sempre lançam uma espécie de “novas features do Java 7”, mas esquecem que não há JSR, não há apoio (e com razão) da Apache e, possivelmente, do Google, e não há mais a aparente benevolência da Sun.

Talvez um dia saia, mas é de um futuro tão incerto que me faz pensar: pra que se preocupar tanto?
[/quote]

Pelo jeito, você não acompanha o desenvolvimento dele. hehehe
Ele tem o cronograma dos builds, as JSRs e os recursos planejados, está em desenvolvimento e tem data prevista, sim. Quaisquer alterações no cronograma costumam ser lançadas no site, que é de onde as pessoas aqui do forum buscam informações.

Era assim com a Sun, continua sendo com a Oracle, pelo menos até agora.

[quote=marcosalex]Pelo jeito, você não acompanha o desenvolvimento dele. hehehe
Ele tem o cronograma dos builds, as JSRs e os recursos planejados, está em desenvolvimento e tem data prevista, sim. Quaisquer alterações no cronograma costumam ser lançadas no site, que é de onde as pessoas aqui do forum buscam informações.

Era assim com a Sun, continua sendo com a Oracle, pelo menos até agora.[/quote]

Cite pra mim quais são essas JSRs, tem uma listinha aqui.

Ter cronograma não implica que vai ser respeitado (“Era assim com a Sun, continua sendo com a Oracle”).

Ter gente desenvolvendo não implica haver uma aprovação no JCP (“Era assim com a Sun, continua sendo com a Oracle”).

A resposta simples é “não”. Isso mesmo ele sendo um dos bugs mais votados,

http://bugs.sun.com/view_bug.do?bug_id=6530906

Realmente, você não acompanha o desenvolvimento. :lol: :lol: :lol:

Quando você estiver mais infomado, a gente retoma o diálogo, ok?

Dizem que sim, do mesmo modo que dizem que o Joda-Time vai entrar também, mas acredito que apenas o Joda entre.

mas agora, parando um pouco com o trollismo

toda linguagem de programação que quer atacar java, principalmente as de script (groovy, ruby, python) usam o mesmo exemplo, o de sempre e provavelmente o pior, que mostra N drawbacks da linguagem numa situação simples.

num código de abrir arquivo, o cara tem que lidar com Streams de baixo nível e muitos try/catches inúteis, checked exceptions etc parecem ser os primordiais pro Java virar alvo de críticas e mostrando como “qualquer linguagem é melhor”

não que isso tenha sido discutido nesse tópico, longe disso, mas é que os exemplos de código (que eu mesmo postei também rs) me fizeram lembrar de outros flamewars em fóruns ou até em livros o.O

Acho que é válido notar que vc pode escrever 1 linha de código ao invés de 20 para ler um arquivo. Mas se vc copia e cola no final não faz diferença.

Eu posso fazer assim no JAVA 7?

int codCadastro = 345;

try (Connection con = ConnectionFactory.getNewConnection();
      PreparedStatement ps;
      ResultSet rs; ) {

      String sql = "select * from cadastro where id = ?";
      ps = con.prepareStatement(sql);
      ps.setInteger(1, codCadastro);
      rs = ps.executeQuery();

      if (rs.next()) {
          //....
   
      }


} catch (Exception e) {
}

Ou seja, declarar objetos que quero fechar no try, sem inicializá-los dentro do mesmo? (vide os objetos rs e ps).
Gostaria de saber porquê eu acabo setando os demais objetos dentro do try…

Um exemplo simples. (Fiz um exemplo boboca, suficiente para ser compilado sem referência a nenhuma classe externa. Obviamente você vai usar seu ConnectionFactory mesmo.) Tratei a exceção só no bloco mais externo, que é o que você faria na verdade.

[code]
import java.sql.*;

class TesteTryWithResources {

public static void main (String[] args) {
int codCadastro = 345;  
String sql = "select * from cadastro where id = ?";  
    String url = ".....";

try (Connection con = DriverManager.getConnection (url)) {
        try (PreparedStatement ps = con.prepareStatement(sql)) {
            try (ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                }
            }
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
}

} [/code]

Outra forma, que é obviamente mais elegante, é:

import java.sql.*;

class TesteTryWithResources {

    public static void main (String[] args) {
        int codCadastro = 345;  
        String sql = "select * from cadastro where id = ?";  
        String url = ".....";
   
        try (
            Connection con = DriverManager.getConnection (url);
            PreparedStatement ps = con.prepareStatement(sql);
            ResultSet rs = ps.executeQuery()) {

            while (rs.next()) {
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
}