Back-End

30 abr, 2018

Tudo o que você precisa saber sobre as novidades do Java 10

Publicidade

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