Pular para o conteúdo principal

Novidades do Java 16

 


Novidades do Java 16


2020 provou ser um ano memorável para Java, pois comemoramos seu 25º aniversário. Com mais de duas décadas de inovação, Java continuou a ser:


  • Flexível ao se adaptar ao cenário de tecnologia em mudança, enquanto permanece independente da plataforma.

  • Confiável por manter a compatibilidade com versões anteriores.

  • Desempenho ao acelerar a inovação sem sacrificar a segurança.


Juntamente com a capacidade do Java de aumentar o desempenho, a estabilidade e a segurança da plataforma ao longo do caminho, ela continua a ser a linguagem de programação mais popular do mundo entre os desenvolvedores. De acordo com o último relatório da IDC “Java Turns 25”, mais de nove milhões de desenvolvedores, representando 69% dos desenvolvedores em tempo integral em todo o mundo, usam Java - mais do que qualquer outra linguagem.


Demonstrando ainda mais o caminho de inovação contínua do Java, a Oracle tem o orgulho de anunciar a disponibilidade geral do Java 16, representando o sétimo lançamento de recurso como parte da cadência de seis meses. Esse nível de previsibilidade permite que os desenvolvedores gerenciem mais facilmente sua adoção de inovação, graças a um fluxo constante de mudanças esperadas. Assim, não é mais preciso esperar 3 anos ou mais para termos uma nova versão e experimentar novos recursos.


Evolução do Java desde o lançamento do Java 9 com releases a cada 6 meses. Fonte: https://blogs.oracle.com/java-platform-group/the-arrival-of-java-16



Java 16 disponível

O Java 16 pode ser baixado através do site da Oracle e também do projeto AdoptOpenJDK.


É esperado que a versão 17 seja a LTS, o suporte de longo prazo (acrônimo em inglês de long-term support) e será lançada em Setembro de 2021, porém já é possível fazer o download de compilações diárias no jdk.java.net.


Novidades do Java 16

Junto com milhares de atualizações de desempenho, estabilidade e segurança, o Java 16 oferece aos usuários dezessete melhorias / alterações principais (conhecidas como JDK Enhancement Proposals - JEPs), incluindo três módulos de incubadora e um recurso de visualização (preview feature).


Alguns aprimoramentos são introduzidos nos módulos Incubator, um meio de colocar APIs e ferramentas não finais nas mãos dos desenvolvedores que permite aos usuários oferecer feedback que pode, em última análise, melhorar a qualidade da plataforma Java.


Da mesma forma, alguns aprimoramentos são introduzidos como recursos de visualização (Preview features), linguagem ou recursos de VM da plataforma Java SE que são totalmente especificados, totalmente implementados e, ainda assim, impermanentes. Eles são disponibilizados em lançamentos de recursos JDK para provocar feedback do desenvolvedor com base no uso do mundo real, o que pode fazer com que se tornem permanentes em um lançamento futuro. Isso oferece aos usuários a chance de fornecer feedback em tempo hábil, além de permitir aos fornecedores de ferramentas a oportunidade de construir suporte para o recurso antes que a maioria dos desenvolvedores Java o use na produção.


Os 17 JEPs entregues com Java 16 foram agrupados em seis categorias diferentes:


  1. Novos recursos de linguagem


JEP 394 Pattern Matching for instanceof


Introduzido pela primeira vez como um recurso de visualização no Java 14 e novamente no Java 15, o Pattern Matching aprimora a linguagem de programação Java com a correspondência de padrões para o operador instanceof.

Pattern Matching permite que a lógica comum em um programa, ou seja, a extração condicional de componentes de objetos, seja expressa de forma mais concisa e segura.


Antes:


if (obj instanceof String) {
    String s = (String) obj;    // grr...
    ...
}


Depois:


if (obj instanceof String s && s.length() > 5) {
    flag = s.contains("jdk");
}



JEP 395 Records


Também introduzido pela primeira vez como um recurso de visualização no Java 14 e novamente no Java 15, Records fornece uma sintaxe compacta para declarar classes que são portadores transparentes para dados imutáveis superficiais. Isso reduzirá significativamente o detalhamento dessas classes e irá melhorar a capacidade de leitura e manutenção do código. Este tipo de classe possui muitas restrições se comparadas com classes normais. Ex: 


  • Uma Record class não possui uma cláusula extends

  • Uma Record class não pode ser abstrata

  • Os atributos derivados da classe Record são todos finais

  • Não pode declarar campos de instância

  • Não pode declarar métodos nativos



  1. Melhorias na JVM


JEP 376 ZGC Concurrent Thread Processing


JEP 376 move o processamento da pilha de threads do ZGC de pontos seguros para uma fase simultânea, permitindo pausas de menos de milissegundos dentro dos pontos seguros de GC, mesmo em grandes heaps. A remoção da fonte final de latência no coletor de lixo ZGC irá melhorar muito o desempenho e a eficiência dos aplicativos nesta e nas versões subsequentes.


JEP 387 Elastic Metaspace


Este recurso retorna a memória de metadados de classe HotSpot VM não utilizada (ou seja, meta-espaço) para o sistema operacional mais prontamente, reduzindo a carga de meta-espaço (Footprint). Os aplicativos com atividades pesadas de carga e descarga de classe podem acumular muito espaço não utilizado.


O novo esquema aloca memória metaspace em pedaços menores, reduz a sobrecarga e a fragmentação do carregador de classes. Ele melhora a elasticidade, retornando a memória meta espacial não utilizada para o sistema operacional, o que leva a um maior desempenho do aplicativo e diminui a utilização da memória.


  1. Novas ferramentas e bibliotecas


JEP 380 Unix-Domain Socket Channels


Os soquetes de domínio Unix têm sido um recurso da maioria das plataformas Unix e agora são suportados no Windows 10 e Windows Server 2019. Este recurso adiciona suporte de soquete de domínio Unix (AF_UNIX) ao canal de soquete e APIs de canal de soquete de servidor no java pacote .nio.channels. Para comunicação local entre processos, os soquetes de domínio Unix são mais seguros e mais eficientes do que as conexões de loopback TCP / IP.


JEP 392 Packaging Tool


Esse recurso foi introduzido pela primeira vez como um módulo incubado no Java 14. Essa ferramenta permite empacotar aplicativos Java autocontidos. Ele oferece suporte a formatos nativos para oferecer aos usuários finais uma experiência de instalação natural. Esses formatos incluem msi e exe no Windows, pkg e dmg no macOS e deb e rpm no Linux. Ele também permite que os parâmetros de tempo de inicialização sejam especificados no momento do empacotamento e possam ser chamados diretamente, a partir da linha de comando ou programaticamente, por meio da API ToolProvider. Observe que o nome do módulo jpackage muda de jdk.incubator.jpackage para jdk.jpackage. Isso melhora a experiência do usuário final ao instalar aplicativos e simplificará as implantações usando o modelo de “loja de aplicativos”.


  1. Futureproofing Your Work (Prepare-se para o futuro)


JEP 390 Warning for Value-Based Classes


Este recurso designa as classes de wrapper primitivas (java.lang.Integer, java.lang.Double, etc) como baseadas em valor (semelhante a java.util.Optional e java.time.LocalDateTime) e adiciona forRemoval a seus construtores, que são obsoletos desde o JDK 9, gerando novos avisos. Ele fornece avisos sobre tentativas impróprias de sincronização em instâncias de quaisquer classes baseadas em valores na plataforma Java.


Muitos projetos de código aberto populares já responderam aos avisos de descontinuação desde o Java 9 removendo chamadas do construtor de wrapper de suas fontes, e podemos esperar que muitos mais façam isso, dada a urgência elevada de avisos de "descontinuado para remoção".


Código do construtor da classe java.lang.Integer



JEP 396 Strongly Encapsulate JDK Internals by default

Esse recurso encapsula fortemente todos os elementos internos da JDK por padrão, exceto para APIs internas críticas, como sun.misc.Unsafe. O código compilado com êxito com versões anteriores que acessa APIs internas do JDK pode não funcionar mais por padrão. Essa mudança visa encorajar os desenvolvedores a migrar do uso de elementos internos para o uso de APIs padrão, para que eles e seus usuários possam atualizar sem problemas para versões futuras do Java. O encapsulamento forte é controlado pela opção do iniciador --illegal-access, para JDK 9 até JDK 15, o padrão era um warning e, a partir do JDK 16, o padrão é negar. Ainda é possível relaxar o encapsulamento de todos os pacotes com uma única opção de linha de comando; no futuro, apenas a abertura de pacotes específicos com --add-opens funcionará.


  1. Incubator and Preview Features


Aqui serão listadas as features que entrarão como preview e não são garantia que permanecerão na plataforma em versões futuras.


JEP 338 Vector API (Incubator)


Esta API incubada fornece uma iteração inicial de uma API para expressar cálculos vetoriais que compilam de forma confiável em tempo de execução para obter instruções de hardware de vetor ideais em arquiteturas de CPU suportadas e, assim, atingir desempenho superior para cálculos escalares equivalentes. Ele permite tirar proveito das instruções Single Instruction Multiple Data (SIMD) disponíveis na maioria das CPUs modernas. Embora o HotSpot suporte a auto vetorização, o conjunto de operações escalares transformáveis é limitado e frágil a alterações no código. Essa API permitirá que os desenvolvedores escrevam facilmente algoritmos de vetor portáteis e de alto desempenho em Java.


JEP 389 Foreign Linker API (Incubator)


Esta API incubada oferece acesso puro ao Java com tipagem estática ao código nativo. Essa API simplificará consideravelmente o processo complicado e sujeito a erros de vinculação a uma biblioteca nativa. Java oferece suporte a chamadas de métodos nativos por meio da Java Native Interface (JNI) desde Java 1.1, mas é difícil e frágil. Os desenvolvedores Java devem ser capazes de usar qualquer biblioteca nativa considerada útil para uma tarefa específica. Ele também fornece suporte de função estrangeira sem a necessidade de qualquer código JNI.


JEP 393 Foreign Memory Access API (3rd Incubator)

Introduzida pela primeira vez como uma API incubada no Java 14 e novamente no Java 15, esta API permite que programas Java operem com segurança e eficiência em vários tipos de memória externa (por exemplo, memória nativa, memória persistente, memória heap gerenciada, etc.). Ele também fornece a base para a API do Linker Estrangeiro (Foreign Linker API).


JEP 397 Sealed Classes (2nd Preview)


Este recurso de visualização restringe quais outras classes ou interfaces podem estendê-los ou implementá-los. Ele permite que o autor de uma classe ou interface controle qual código é responsável por implementá-la. Além disso, fornece uma maneira mais declarativa do que os modificadores de acesso para restringir o uso de uma superclasse. E apóia futuras direções na correspondência de padrões, sustentando a análise exaustiva de padrões.

  1. Improving Productivity for OpenJDK Developers

O restante das mudanças não estão diretamente visíveis para desenvolvedores Java (aqueles que usam Java para codificar e executar aplicativos), mas apenas para desenvolvedores Java (aqueles que trabalham diretamente no OpenJDK).

JEP 347 Enable C++14 Language Features (in JDK source code)

Isso permite o uso de recursos da linguagem C++ 14 no código-fonte JDK que usa o C++ e fornece orientação específica sobre quais desses recursos podem ser usados no código HotSpot. Por meio do JDK 15, os recursos de linguagem usados pelo código C++ no JDK foram limitados aos padrões de linguagem C++ 98/03. Requer a atualização da versão mínima aceitável de vários compiladores de plataforma.

JEP 357 Migrate from Mercurial to Git

JEP 369 Migrate to GitHub

Estas JEPs migram os repositórios de código-fonte da Comunidade OpenJDK do Mercurial (hg) para o Git e os hospedam no GitHub para JDK 11 e posterior. A migração inclui a atualização de ferramentas como jcheck, webrev e defpath para Git. O Git reduz o tamanho dos metadados (cerca de ¼ do tamanho) preservando o espaço em disco local e reduzindo o tempo de clone. Ferramentas modernas são mais bem integradas ao Git do que ao Mercurial. Repositórios OpenJDK Git estão agora em https://github.com/openjdk

JEP 386 Alpine Linux Port
JEP 388 Windows/AArch64 Port

O foco destas JEPs não é o esforço de portabilidade em si, que já foi feito, mas integrá-las ao repositório de linha principal do JDK. O JEP 386 transporta o JDK para o Alpine Linux e outras distribuições que usam musl como sua biblioteca C primária em x64 e AArch64. Além disso, o JEP 388 transporta o JDK para o Windows AArch 64 (ARM64).

Suporte de ferramentas

O suporte de ferramentas atuais ajuda a aumentar a produtividade do desenvolvedor. Com o Java 16, continuamos a dar as boas-vindas aos esforços dos principais fornecedores de IDE, cujas soluções de ferramentas oferecem suporte aos desenvolvedores para as versões atuais do Java. Os desenvolvedores podem esperar receber suporte Java 16 com os seguintes IDEs:

Créditos: Blog Oracle






Comentários

Postagens mais visitadas deste blog

Java Records

  Java Records Imutável, Simples e limpa Esta funcionalidade da linguagem apareceu pela primeira vez na versão 14 como experimental e assim continuou até a versão 15 . Agora liberada de forma definitiva no Java 16 . O objetivo é ser possível ter classes que atuam como portadores transparentes de dados imutáveis. Os registros podem ser considerados tuplas nominais. Ou seja, após criado, um record não pode mais ser alterado. Records oferece uma uma sintaxe compacta para declarar classes que são portadores transparentes para dados imutáveis superficiais visando reduzir significamente o detalhamento dessas classes e irá melhorar a capacidade de leitura e manutenção do código. Vamos seguir um exemplo de uma classe chamada Pessoa . O primeiro exemplo vamos utilizar o modo tradicional. public class Pessoa { private String nome; private int idade; public Pessoa (String nome, int idade) { super (); this .nome = nome; this .idade = idade; } public String getNo

Java 8 ao 18: Mudanças mais importantes na plataforma Java

    Vamos rever muitas das mudanças mais importantes na plataforma Java que aconteceram entre a versão 8 (2014) e 18 (2022)   O Java 8 foi lançado em março de 2014 e o Java 18 em março de 2022. São 8 anos de progresso, 203 JEPs (JDK Enhancement Proposals ), entre essas duas versões. Neste post, revisaremos as mudanças mais importantes e discutiremos os benefícios e desafios da adoção de versões mais recentes do JDK para novos aplicativos e para os mais antigos compilados com versões mais antigas. Desde a versão 9, o Java tem novos recursos a cada 6 meses e é muito difícil acompanhar essas novas mudanças. A maioria das informações na internet descreve as mudanças entre as duas últimas versões do Java. No entanto, se você estiver em uma situação semelhante à minha, não está usando uma das versões mais recentes do Java, mas uma das várias versões anteriores (Geralmente 8 ou 11 que são as versões de suporte estendido). Então é útil saber quais novos recursos foram adicionados d

O suporte de longo prazo e o que o LTS significa para o ecossistema Java

A arte do suporte de longo prazo e o que o LTS significa para o ecossistema Java Aqui está o que o Java 17 tem em comum com o Java 11 e o Java 8. Em junho de 2018, há pouco mais de três anos, a Oracle e outros participantes do ecossistema Java anunciaram uma mudança no modelo de cadência de lançamento para Java SE. Em vez de ter um lançamento principal planejado a cada dois ou quatro anos (que geralmente se torna de três a quatro anos), um novo modelo de lançamento de recursos de seis meses seria usado: a cada três anos, um lançamento seria designado como Long-Term Support (LTS) e receba apenas atualizações trimestrais de segurança, estabilidade e desempenho. Esse padrão foi emprestado descaradamente do modelo de lançamento do Mozilla Firefox, mas o ajustou para ficar mais alinhado com os requisitos de uma plataforma de desenvolvimento. A primeira versão do Java lançada sob esse modelo foi o Java SE 11. O lançamento do Java SE 17, o segundo lançamento do LTS sob o novo