O Java começou o ano com o pé direito. No início do mês de março, a Oracle lançou a versão 10 da linguagem, dando início ao seu novo cronograma de releases à curto prazo. De acordo com o novo cronograma, teremos uma nova versão a cada seis meses. Além destes lançamentos mais curtos, a cada três anos, haverá um lançamento de uma versão LTS (Long-term support). O próximo lançamento do LTS é o Java 11, que deve sair em setembro deste ano.
Neste artigo, daremos uma olhada nas melhorias trazidas nesta nova versão. Você notará que pouca coisa está relacionada a maneira como desenvolvemos com a linguagem, mas com a sua performance por debaixo dos panos.
Inferência de tipos para variáveis locais (JEP 286)
Esta talvez seja a novidade mais interessante. Quando estamos trabalhando com o Java, não é difícil cair em situações bem parecidas como esta:
URL url = new URL("<a href="http://codeprestige.com.br/">http://codeprestige.com.br/</a>");
O que acontece, é que precisamos definir o tipo da variável e então chamar o construtor desta classe, o que resulta em um código deste tipo. A situação fica muito pior quando temos classes com nomes gigantes. No entanto, agora podemos utilizar o var na declaração de variáveis locais, pois o Java irá inferir esse tipo “automagicamente”.
var url = new URL("<a href="http://codeprestige.com.br/">http://codeprestige.com.br/</a>");
Bem bacana, né? Só é preciso lembrar que a especificação diz claramente que só é possível utilizar esta funcionalidade para variáveis locais com inicializadores. Na prática, isso significa que não podemos fazer isso:
var url; url = new URL("<a href="http://codeprestige.com.br/">http://codeprestige.com.br/</a>");
Se quiser saber um pouco mais, o Mateus Malaquias escreveu um artigo especificamente para explicar esta nova funcionalidade, confere lá.
Releases baseados em tempo (JEP 322)
Uma das grandes dificuldades do Java era o tempo que demorava para termos novas funcionalidades. O JavaScript sofria o mesmo problema há alguns anos atrás e o Java está caminhando para a mesma solução: releases baseados em tempo.
O que isso significa? Na prática quer dizer que a cada seis meses uma nova versão do Java será lançada com as funcionalidades que estiverem prontas até então.
Há muita discussão sobre este tópico: muitos defendem a velocidade dos releases enquanto outros são mais conservadores. Mas pelo menos por enquanto, o Java seguirá este novo cronograma:
Garbage-Collector Interface (JEP 304)
Essa funcionalidade aumenta o isolamento do código de diferentes GCs (Garbage Collector) através de uma nova interface. Na prática, isso significa que agora é muito mais fácil excluir um GC de uma compilação do JDK, além de facilitar a inclusão de um novo GC, sem afetar o código já existente.
Parallel Full GC para G1 (JEP 307)
O G1 (Garbage-first collector) foi feito o GC padrão para a JVM, que foi projetado para evitar o chamado Full GC (processo em que ele limpa todo o espaço da memória Heap). Mas quando as coletas simultâneas não conseguiam recuperar a memória com rapidez suficiente, acabavam caindo em um Full GC, e isso criava um problema de performance.
Essa alteração paralelizará o algoritmo completo de GC, de modo que, no evento improvável de um G1 Full GC, o mesmo número de threads possa ser usado nas coletas simultâneas para melhorar o desempenho geral.
Alocação da Heap em dispositivos de memória alternativos (JEP 316)
Agora é possível fazer com que a HotSpot VM aloque o Heap em um dispositivo de memória alternativo, especificado pelo usuário. Por exemplo, esse recurso torna possível designar processos com prioridade mais baixa para usar a memória NV-DIMM e, em vez disso, alocar apenas os processos de prioridade mais alta para a DRAM em um ambiente com várias JVMs.
Remoção da ferramenta de geração de cabeçalho nativo (JEP 313)
Agora não temos mais a ferramenta javah do JDK, uma ferramenta separada para gerar arquivos de cabeçalho ao compilar o código JNI (Java Native Interface), já que isso pode ser feito através do javac.
Compilador JIT experimental baseado em Java (JEP 317)
Essa funcionalidade permite habilitar o compilador JIT (Just in Time) experimental baseado em Java, o Graal, para ser usado como um compilador JIT na plataforma Linux de arquitetura 64x. É possível fazer isso com os seguintes atributos:
-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
No entanto, essa ainda é uma funcionalidade em estágio experimental, o que significa que não deve – de maneira alguma – ser usada em ambientes de produção.
Consolidar os repositórios do JDK em um repositório único (JEP 296)
A questão aqui foi combinar os numerosos repositórios do JDK em um único repositório, por questão de organização e gestão do código.
Conclusão
É verdade que há tempos o Java não é mais a linguagem queridinha da comunidade de desenvolvedores(as). Linguagens como o JavaScript e o Python ocupam as mentes dos(as) programadores(as), principalmente dos mais jovens. Mas com um novo ciclo de atualizações, a linguagem tem tudo para conquistar sua antiga fama.
Caso queira aprender mais sobre JavaScript, existe um curso de ECMAScript 6 disponível na Code Prestige.
E você? O que achou disso tudo? Acredita que o Java tem um futuro promissor pela frente? Comente abaixo!
Referências
- http://openjdk.java.net/projects/jdk/10/
- https://dzone.com/articles/java-10-released-10-new-features-devs-should-know
- https://medium.com/collabcode/primeiro-contato-com-var-no-java-10-ac9ff5baaf17
- http://blog.caelum.com.br/o-minimo-que-voce-deve-saber-de-java-10/
- https://imasters.com.br/desenvolvimento/graalvm-todas-as-linguagens-em-um-lugar-so