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:
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:
Depois:
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
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.
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.
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”.
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á.
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.
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:
JetBrains IDEA
Eclipse Marketplace
Créditos: Blog Oracle
Comentários
Postar um comentário