Atenção: esse artigo tem um vídeo complementar. Clique e assista!

De que se trata o artigo:

Continuamos a cobertura da plataforma Java SE 7, atacando dessa vez as novas APIs e outras melhorias da JVM: aperfeiçoamentos do HotSpot, Java2D, suporte a 64 bits, entre outros.


Para que serve:

Se, como dissemos no artigo passado, “a própria linguagem Java é a ferramenta mais crítica e fundamental”, o que dizer da JVM? Ainda mais crítica, inclusive para adeptos de um número crescente de linguagens como Scala, Groovy, JavaFX etc. A plataforma Java SE é o motor que move todas as aplicações desktop e também corporativas (Java EE, que é uma extensão do SE). O conhecimento aprofundado das capacidades e características da JVM é, muitas vezes, essencial para obter o máximo desempenho ou outras qualidades desejáveis de uma aplicação.

Em que situação o tema é útil:

Se o plano seguir o rumo previsto, quando o leitor receber esta Edição os primeiros Release Candidates do JDK 7 já estarão aparecendo, apontando um release final ainda este ano. Mesmo quem não tiver planos de curto prazo de tirar proveito das novas sintaxes da linguagem Java que vimos no artigo anterior, ou de novas APIs que começaremos a comentar aqui, já deve ir se preparando: por exemplo, não custa nada fazer alguns testes dos seus sistemas com a nova versão da JVM para ver se ocorre alguma regressão, algum ganho de desempenho ou outra mudança digna de nota, positiva ou negativa. Este artigo serve tanto como uma introdução a todos os aspectos do Java SE 7 além da linguagem, quanto um guia para auxiliar na exploração do novo JDK.

Na Edição anterior iniciamos a cobertura do próximo release do Java, começando pelas novidades da linguagem, que já renderam bastante assunto e ainda renderão mais... mas o Java SE 7 não se resume à nova linguagem. O novo release da plataforma também inclui, como de costume, um lote de novidades e melhorias de API ou de infraestrutura. Neste artigo faremos um apanhado destas “outras” novidades.

Finalmente, temos Java SE 7

Este é o primeiro artigo que trata da plataforma Java SE 7 como um todo, e é o primeiro que pode nomear esta plataforma como algo certo e concreto. Até há pouco tempo não havia confirmação oficial sobre tal plataforma, só havia o projeto JDK 7. Mas o JDK é apenas uma implementação, no caso a da Oracle (e por consequência das contribuições ao OpenJDK, da comunidade open source). A plataforma Java SE é definida pelo JCP, mas a JSR necessária ainda não havia sido anunciada. Alguns críticos mais ácidos da Sun (e agora da Oracle), como o pessoal do Apache (devido à velha briga em torno do Harmony), chegaram a sugerir que poderíamos não ter nenhuma JSR e nenhuma plataforma oficial, ou seja que a Oracle iria abandonar a padronização do JCP e simplesmente finalizar o JDK 7 e impô-lo ao mercado sem padrões.

Bem, a dúvida finalmente se dissipou com o anúncio de uma palestra sobre “Java SE 7” de Mark Reinhold (líder do projeto JDK 7), na Devoxx 2010, que acontecerá em Novembro. Ainda não há JSR, mas esta provavelmente será lançada antes da JavaOne 2010, que este ano acontece nos EUA em 19-23 de setembro... e pela primeira vez, no Brasil em 7-9 de dezembro.

O que é que o Java SE 7 tem?

Já cobrimos as novidades da linguagem, o item mais importante desta atualização da plataforma. Este segundo artigo dá uma visão geral do “resto”. Mas não espere uma batelada de novas APIs. O último release da plataforma a acrescentar um volume significativo de APIs foi o J2SE 5.0, e mesmo neste, vários acréscimos foram mera inclusão de APIs que já existiam (como JMX e JAXP) ou alterações incrementais de APIs já da plataforma SE (como JDBC RowSets). No Java SE 6, o número de novas APIs já foi menor, mesmo contando tais casos. E no Java SE 7, é ainda menor. Isso é natural, pois após um período de crescimento explosivo de APIs entre as versões 1.2 e 1.4, a plataforma Java estabilizou, e é bom que seja assim. Muita gente já acha o JRE muito grande, inchado. Nem todas as novas APIs devem ser empilhadas no JRE, só as realmente fundamentais.

Por outro lado, a inovação em outros aspectos não para nunca, de fato até acelera na medida em que menos esforço é investido em novas APIs. Temos um fluxo contínuo de aperfeiçoamentos da própria VM, prometendo avanços na compilação JIT de código, gerenciamento de memória / GC, concorrência, etc. Também há um esforço contínuo na melhora da implementação de APIs, por exemplo as de GUI (AWT, Java2D e Swing), sempre explorando melhor os recursos do hardware gráfico e de toolkits nativos de GUI. Além das novidades de sintaxe, é nessas áreas que o Java SE 7 apresenta seus maiores destaques. Assim, é basicamente disso que vamos falar neste artigo.

Java SE 7 versus JDK 7

Uma consequência deste foco do Java SE 7 – em fatores de implementação, não necessariamente novas APIs – é que muitas dessas novidades são, de fato, novidades do Oracle JDK 7, não do Java SE 7. Por exemplo: a nova pipeline da Java2D para o XRender, o maior destaque desta versão para GUIs AWT/Swing, é um detalhe de implementação da Java2D. Você não encontrará nenhuma JSR falando disso. Os padrões e APIs públicas não dizem nada sobre a implementação da Java2D: se deve ser feita com a GDI, X11, OpenGL, DirectX, CoreGraphics ou qualquer outra tecnologia. Até por que a maioria dessas tecnologias não é portável, mas sim amarrada a cada sistema operacional.

No entanto, o Oracle JDK é um padrão de fato. Seu código-fonte é licenciado para outros distribuidores. Alguns JDKs “alternativos”, como o da HP para HP-UX, são meros portes para outra plataforma, 99% iguais à versão da Sun / Oracle. O Apple JDK é um pouco customizado, especialmente nas tecnologias de GUI. Já o JRockit e o IBM JDK possuem VMs independentes, mas reusam o grosso das APIs. Finalmente, no terreno do Java Livre, o OpenJDK também é basicamente uma cópia do código da Oracle, exceto por customizações pontuais, em geral focadas na substituição de alguns componentes não-livres do Oracle JDK.

Nem a OpenGL escapa totalmente disso, pois cada SO e GPU possui um nível diferente de suporte à OpenGL.

Isso significa que, embora este artigo cubra vários itens que são “detalhe de implementação”, na prática estas novidades, e o conhecimento delas, são válidos para diversas outras distribuições da plataforma Java SE 7. Por exemplo, o XRender acabará aparecendo na maioria dos JDKs para Linux e Unix baseados no código da Oracle. Já o novo coletor G1 deve aparecer em alguns (como OpenJDK, Apple JDK e HP-UX JDK), mas não necessariamente em todos (por exemplo o IBM JDK tem uma VM totalmente independente, e não irá incorporar o G1).

Para tornar as coisas mais claras, cada título de seção ou quadro do artigo terá um dos símbolos:

[Java SE]: Funcionalidade “pública”, padronizada pelo JCP. Faz parte da plataforma e será encontrada em qualquer implementação da plataforma;

[JDK]: Detalhe de implementação. Será encontrado no Oracle JDK e, possivelmente, em outras implementações que sejam baseadas no código da Oracle.

As seções de ambas as categorias estão misturadas, pois a ordem das seções privilegia outros fatores editoriais como as dependências entre os assuntos. Os itens [JDK] são cobertos em maior profundidade, pois esgotaremos o assunto neste artigo. A maioria dos itens [Java SE] só poderia ser bem coberta com um artigo dedicado – que esperamos ter no futuro.

Antes de entrar no tema deste artigo, porém, a próxima seção complementa a Edição anterior, que tratou das novas sintaxes da linguagem Java. Procurei manter esta seção acessível a quem não tiver lido o artigo anterior, e independente do artigo atual para poder ser pulada sem prejuízo do restante.

[Java SE] O Estado do Lambda

Quando finalizei o artigo da Edição 82, estava certo que todo o material coberto – as novas sintaxes da linguagem Java 7 – já era suficientemente estável. Até por que quase tudo já estava implementado, seja nos builds de desenvolvimento integrados do JDK 7 (que podem ser baixados de jdk7.dev.java.net), seja nos repositórios secundários de cada subprojeto (sem builds binários, mas permitindo aos mais pacientes compilar os fontes do compilador, VM e APIs atualizadas).

Infelizmente errei a aposta no caso dos lambdas. Pouco após o fechamento da Edição, em 6 de julho, a Oracle surpreendeu com o documento State of the Lambda:


  cr.openjdk.java.net/~briangoetz/lambda/lambda-state-2.html 

Seu título é um toque humorístico de Brian Goetz (imita “State of the Union”, título do tradicional discurso anual do Presidente dos EUA no congresso). A data também revela a veracidade dos estereótipos sobre geeks: há programa melhor para um feriadão (3-5 de Julho nos EUA) do que fazer uma nova versão de uma linguagem de programação? J

...

Quer ler esse conteúdo completo? Tenha acesso completo