Concrete Logo
Hamburger button

Introdução ao Java 9 – Quais são as principais novidades?

  • Blog
  • 9 de Outubro de 2017
Share

Começamos hoje aqui no Blog uma série com vários posts sobre o que temos de novo no Java 9.

A grande mudança e a mais polêmica é o Jigsaw, que trouxe a modularização do JDK e que no final acabou se afastando da plataforma monolítica do Java SE. O grande desafio do Java foi e ainda é proporcionar mudanças boas e eficientes para a linguagem sem quebrar a compatibilidade com as versões anteriores. Imagine… hoje existem milhões de devices e desenvolvedores utilizando Java.

A questão da modularização vai possibilitar grande melhoria no desempenho as aplicações, em particular as que são executadas em devices com baixo desempenho. Histórias contam que o plano de modularizar o JDK e seus pacotes não é recente, isso já era planejado bem antes do lançamento do Java 7.

Uma outra novidade bem interessante para a linguagem foi o Jshell, ferramenta semelhante às que já existem hoje em outras linguagens de programação como scala, JavaScript e outros. Trata-se de um REPL (Read-Eval-Print Loop), um terminal interativo, que você pode utilizar para rodar código Java sem ter que ficar criando classes e métodos Main para executar seus testes rápidos e experimentos.

Métodos privados em interface, suporte a UTF-8 em arquivos .properties, novos default methods em algumas API’s como por exemplo a de Stream (Reactive Streams), HTTP/2 Client, API’s de Logging e mais: houve também uma melhora significativa no que diz respeito à performance: agora o Java 9 adotou o G1 como default GC. Também conhecido como “Garbage-first”, ele atua com um esquema concorrente de multi-threads para a sua coleta.

JEPs (JDK Enhancement Proposals) é a forma como a SPEC Java é dividida. JEP’s são propostas de melhorias, correções ou novas features da linguagem. Nesse link podemos ver uma lista com diversas propostas, muitas até hoje não foram implementadas nem mesmo nas versões que estão especificadas na relação.

Abaixo segue um pequeno overview das principais mudanças e uma breve introdução. Nas próximas semanas vamos entrar nos detalhes de cada uma delas.

-> Jshell

Essa grande novidade (NO JAVA 0.o) trata de uma ferramenta para um ambiente interativo, no qual você pode digitar comandos Java em um terminal e obter retorno real-time, sem ter que criar uma classe, arquivo ou algo do tipo. Que tal? Outras linguagens já possuem recursos do tipo, como Javascript, Scala e outras. REPL (Read Eval Print Loop) é o nome mais conhecido dessa prática.

-> Melhoria nas APIs

Muitas APIs ganharam melhorias no Java 9, mas Collections, Streams, Collectors, e Optional são os destaques. Lists e Sets ganharam o método “of”, com isso a forma de criar coleções muda e pode ser feita de forma mais simples. Ex: Set<String> cars = Set.of(“Ferrari”,”Fusca”, “Bugatti”).

-> HTTP2

Seus principais objetivos são: reduzir a latência com a multiplexação completa de solicitação e resposta, minimizar a carga do protocolo com uma compressão eficiente dos campos do cabeçalho HTTP e adicionar suporte à priorização de solicitações de push para o servidor. Em 2015, o IETF (Internet Engineering Task Force) publicou a especificação do HTTP2. É aí que entra o Java 9. Além de dar suporte para o HTTP2 ele tem uma completa API para o HTTP2 e WebSockets.

-> Streams Reativos

Atualmente, existem várias implementações que fazem de fato o fluxo reativo na JVM, RXJava, Project Reactor etc. A ideia do Java 9 não foi criar mais uma implementação, mas sim padronizar todo esse processo em um conjunto de interfaces que forma uma infraestrutura clara e objetiva para o seu uso. Foi assim que nasceu a Flow API (sobre a qual falaremos em um próximo post) =).

-> Módulos

JPMS (Java Platform Module System), vulgo Jigsaw, é o projeto que fez a modularização do JDK9. Módulos podem ser vistos como uma coleção de código e dados que possui um nome. Não é a mesma coisa que um Jar ou War, mas é como se você pegasse algumas classes que fazem sentido isoladas das demais. Com isso, você pode dizer qual parte do código depende de qual e identificar antecipadamente a falta de dependências, além de permitir que diferentes módulos façam a implementação da API de um determinado módulo.

-> API de Logging

Existem muitos frameworks de Log atualmente, o grande problema é que cada framework pode escolher uma biblioteca diferente para trabalhar. Dessa forma seu classpath acaba virando uma salada de libs (java.util.logging, logback, log4j etc). Visto isso, o JDK9 criou o System.Logger, que possibilita a criação de um provedor padrão de mensagens para ser utilizado em seu código.

-> Stack-Walking API

Implementada a partir da JEP 259 ela define um padrão eficiente para stack-tracing que permite filtrar de forma fácil a pilha de chamadas da aplicação. Existem algumas razões pelas quais você precisaria acessar elementos de rastreamento da stack:

  • Entender certo comportamento de um método no qual um problema desconhecido está acontecendo e você não faz ideia do porquê;
  • Detalhar a rastreabilidade de certo elemento em forma de LOG para ajudar na depuração;
  • Mapear quem chamou um determinado método para identificar a origem de um possível vazamento de memória.

-> Garbage Collector G1

Houve também uma melhora significativa no que diz respeito à performance. Agora o Java 9 adotou o G1 como default GC. Conhecido como “Garbage-first”, atua com um esquema concorrente de multi-threads para a sua coleta. Ele foi programado para trabalhar com menor tempo de pausa e de forma mais previsível, a fim de entregar maior performance em seus eventos de cleanning.

Por hoje é só, galera. Aguardem os próximos posts no blog da Concrete, porque vamos abordar mais sobre cada item citado aqui. Se tiver alguma dúvida ou tem algo a dizer, aproveite os campos abaixo. Até mais!

É desenvolvedor Java e gostaria de trabalhar em um time ágil e multidisciplinar? Clique aqui!