Após seis meses de desenvolvimento, a Oracle lançou a plataforma Java SE 17 (Java Platform, Standard Edition 17), cuja implementação de referência é o projeto aberto OpenJDK. Com exceção da remoção de algumas funcionalidades obsoletas, a Java SE 17 preserva a compatibilidade com versões anteriores da plataforma Java — a maioria dos projetos Java escritos anteriormente funcionará sem alterações sob a nova versão. Versões prontas para instalação do Java SE 17 (JDK, JRE e Server JRE) estão disponíveis para Linux (x86_64, AArch64), Windows (x86_64) e macOS (x86_64, AArch64). A implementação de referência da Java 17, desenvolvida no âmbito do projeto OpenJDK, é totalmente aberta sob a licença GPLv2 com exceções do GNU ClassPath, permitindo a vinculação dinâmica com produtos comerciais.
Java SE 17 é classificado como uma versão com suporte de longo prazo (LTS), com atualizações programadas até 2029. O lançamento de atualizações para a versão intermediária anterior, Java 16, foi encerrado. A versão anterior LTS, Java 11, será mantida até 2026. O próximo lançamento LTS está previsto para setembro de 2024. Vale lembrar que, a partir do lançamento do Java 10, o projeto adotou um novo processo de desenvolvimento, com um ciclo de lançamento mais curto. A nova funcionalidade agora é desenvolvida em um branch master constantemente atualizado, do qual novos branches são derivados a cada seis meses para a estabilização dos lançamentos.
Entre as novidades do Java 17, destacam-se:
- Foi proposta uma implementação experimental de correspondência por padrão em expressões 'switch', permitindo que nas marcações 'case' sejam utilizados não valores exatos, mas padrões flexíveis que abrangem uma série de valores, para os quais anteriormente eram necessárias longas cadeias de expressões 'if...else'. Além disso, dentro do 'switch' foi providenciada a possibilidade de processar valores NULL. Object o = 123L; String formatted = switch (o) { case Integer i -> String.format('int %d', i); case Long l -> String.format('long %d', l); case Double d -> String.format('double %f', d); case String s -> String.format('String %s', s); default -> o.toString(); };
- Foi estabilizado o suporte para classes e interfaces seladas, que não podem ser usadas por outras classes e interfaces para herança, extensão ou sobreposição de implementação. Classes seladas também oferecem uma maneira mais declarativa de restringir o uso do superclasse do que os modificadores de acesso, baseando-se na enumeração explícita das subclasses permitidas para extensão. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
- Foi proposta uma segunda implementação preliminar da API Vector, fornecendo funções para cálculos vetoriais, que são executados utilizando instruções vetoriais dos processadores x86_64 e AArch64, permitindo aplicar operações simultaneamente a vários valores (SIMD). Ao contrário das capacidades de auto-vetorização de operações escalares fornecidas pelo compilador JIT HotSpot, a nova API permite gerenciar explicitamente a vetorização para o processamento paralelo de dados.
- Foi adicionada uma implementação preliminar da API Foreign Function & Memory, por meio da qual aplicativos podem interagir com códigos e dados fora do ambiente de execução Java. A nova API permite chamar funções que não são executadas na JVM de forma eficiente e acessar a memória que não é gerida pela JVM. Por exemplo, é possível chamar funções de bibliotecas compartilhadas externas e acessar dados do processo sem usar JNI.
- O mecanismo de renderização para macOS, que suporta a API Java 2D, que por sua vez é usada na API Swing, foi adaptado para o uso da API gráfica Metal. Por padrão, na plataforma macOS, ainda é usado OpenGL, e a ativação do suporte ao Metal requer a configuração do parâmetro “-Dsun.java2d.metal=true” e a presença de pelo menos a versão 10.14.x do macOS.
- Foi adicionado um porto para a plataforma macOS/AArch64 (computadores Apple baseados nos novos chips Apple M1). A característica distintiva do porto é o suporte ao mecanismo de proteção de memória W^X (Write XOR Execute), onde as páginas de memória não podem ser acessadas simultaneamente para gravação e execução. (o código só pode ser executado após a gravação ser proibida, e a gravação em uma página de memória só é possível após a execução ser proibida).
- A utilização estrita (strictfp) da semântica para expressões de ponto flutuante foi restaurada. O suporte à semântica "default", disponível desde o lançamento do Java 1.2, que incluía simplificações para funcionamento em sistemas com copro-processadores matemáticos x87 muito antigos (depois do surgimento das instruções SSE2, a necessidade de semântica adicional desapareceu), foi descontinuado.
- Novos tipos de interfaces para geradores de números pseudoaleatórios foram implementados, além de algoritmos adicionais para uma geração mais qualificada de números aleatórios. Os aplicativos agora têm a opção de escolher o algoritmo de geração de números pseudoaleatórios. O suporte para a geração de fluxos de objetos aleatórios foi aprimorado.
- Foi implementada a encapsulação estrita obrigatória de todos os elementos internos do JDK, exceto APIs críticas, como sun.misc.Unsafe. A encapsulação estrita bloqueia tentativas de acesso a classes, métodos e campos internos do código. Anteriormente, o modo de encapsulação estrita poderia ser desativado usando a opção "—illegal-access=permit", mas agora foi declarado obsoleto. Para aplicativos que necessitam de acesso a classes, métodos e campos internos, é necessário defini-los explicitamente usando a opção "—add-opens" ou o atributo Add-Opens no arquivo de manifesto.
- Os aplicativos agora podem definir filtros para a deserialização de dados, que podem depender do contexto e ser escolhidos dinamicamente em ligação a operações de deserialização específicas. Os filtros definidos são aplicáveis em todo o máquina virtual (JVM-wide), ou seja, cobrem não apenas o próprio aplicativo, mas também as bibliotecas de terceiros utilizadas no aplicativo.
- No Swing, foi adicionado o método javax.swing.filechooser.FileSystemView.getSystemIcon para carregar ícones em alta definição, permitindo uma melhor formação da interface em telas com alta densidade de pixels (HighDPI).
- Na API java.net.DatagramSocket, foi implementado suporte para conectar a grupos Multicast sem a necessidade de usar a API separada java.net.MulticastSocket.
- A ferramenta IGV (Ideal Graph Visualizer) foi aprimorada, fornecendo visualização interativa da representação intermediária do código no compilador JIT HotSpot VM C2.
- Na JavaDoc, de forma semelhante ao compilador javac, agora ao exibir um erro, o número da linha problemática no arquivo fonte e o local do erro serão indicados.
- Adicionado o atributo native.encoding, que reflete o nome da codificação de caracteres do sistema (UTF-8, koi8-r, cp1251, etc.).
- Adicionado o interface java.time.InstantSource, permitindo manipular o tempo sem estar vinculado a um fuso horário.
- Adicionado o API java.util.HexFormat para conversão em representação hexadecimal e vice-versa.
- Adicionado ao compilador o modo blackhole, que desativa operações de exceção de código não utilizado (eliminação de código morto), o que pode ser utilizado em testes de desempenho.
- Adicionada ao Runtime a opção "-Xlog:async" para registrar logs em modo assíncrono.
- Ao estabelecer conexões seguras, por padrão é utilizado o TLS 1.3 (anteriormente era utilizado o TLS 1.2).
- Classificado como obsoleto e projetado para remoção, o API Applet (java.applet.Applet*, javax.swing.JApplet), usado para executar aplicativos Java em navegadores (perdeu relevância após o fim do suporte ao plugin Java para navegadores).
- Classificado como obsoleto e projetado para remoção, o Security Manager, que há muito perdeu relevância e se tornou obsoleto após o fim do suporte ao plugin do navegador.
- Removido o mecanismo RMI Activation, que se tornou obsoleto, foi reclassificado como uma opção já no Java 8 e quase não é aplicado na prática moderna.
- Removido do SDK o compilador experimental que suporta JIT (just-in-time) para compilação dinâmica de código Java para a HotSpot JVM, bem como o modo de compilação antecipada (AOT, ahead-of-time) de classes em código de máquina antes da execução da máquina virtual. O compilador foi escrito em Java e se baseou no trabalho do projeto Graal. Observa-se que manter o compilador requer um grande esforço, que não se justifica devido à falta de interesse dos desenvolvedores.
Fonte: opennet.ru
