Após seis meses de desenvolvimento, a Oracle lançou a plataforma Java SE 18 (Java Platform, Standard Edition 18), cuja implementação de referência é o projeto aberto OpenJDK. Exceto pela remoção de algumas funcionalidades obsoletas, o Java SE 18 mantém a compatibilidade com versões anteriores da plataforma Java — a maioria dos projetos Java já escritos funcionará sem alterações ao serem executados na nova versão. As compilações prontas para instalação do Java SE 18 (JDK, JRE e Server JRE) estão preparadas para Linux (x86_64, AArch64), Windows (x86_64) e macOS (x86_64, AArch64). A implementação de referência do Java 18, 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.
O Java SE 18 é classificado como uma versão com ciclo de suporte regular, com atualizações sendo lançadas até o próximo lançamento. Para uma versão com suporte de longo prazo (LTS), recomenda-se o uso do Java SE 17, cuja atualização será disponibilizada até 2029. Vale lembrar que, a partir do lançamento do Java 10, o projeto passou a adotar um novo processo de desenvolvimento, com um ciclo mais curto para a formação de novos lançamentos. Novas funcionalidades agora são desenvolvidas em um branch master continuamente atualizado, que incorpora mudanças já finalizadas e a partir do qual são ramificadas versões para estabilização a cada seis meses.
Entre as novidades do Java 18, podemos destacar:
- A codificação UTF-8 está habilitada por padrão. A API Java, que manipula dados textuais considerando a codificação de caracteres, agora usará por padrão UTF-8 em todas as plataformas, independentemente das configurações do sistema e da localidade definida. Para retornar ao comportamento anterior, em que a codificação é escolhida com base na localidade do sistema, pode-se usar o parâmetro "-Dfile.encoding=COMPAT".
- O pacote com.sun.net.httpserver foi incluído, que contém a ferramenta jwebserver e uma API de biblioteca com a implementação de um servidor http simples para entregar conteúdo estático (CGI e manipuladores semelhantes a servlet não são suportados). O servidor http incorporado não é otimizado para cargas de trabalho e não suporta controle de acesso e autenticação, pois é voltado principalmente para uso durante o desenvolvimento para a criação de protótipos, depuração e teste de projetos.
- O JavaDoc agora suporta a tag "@snippet" para incorporar exemplos de trabalho e fragmentos de código na documentação da API, que podem ser usados com ferramentas para verificação de correção, destaque de sintaxe e integração com IDEs.
- A implementação da API java.lang.reflect (Core Reflection) foi reformulada, destinada a obter informações sobre métodos, campos e construtores de classes, bem como acesso à estrutura interna das classes. A própria API java.lang.reflect permaneceu inalterada, mas agora é implementada por meio do uso de descritores de métodos (method handles), fornecidos pelo módulo java.lang.invoke, em vez de utilizar geradores de bytecode. A mudança permitiu unificar as implementações de java.lang.reflect e java.lang.invoke, simplificando sua manutenção.
- Uma terceira implementação preliminar da API Vector foi proposta, fornecendo funções para cálculos vetoriais que são realizados usando instruções vetoriais de processadores x86_64 e AArch64, permitindo a aplicação simultânea de operações a vários valores (SIMD). Ao contrário das capacidades de vetorização automática de operações escalares oferecidas pelo compilador JIT HotSpot, a nova API permite o controle explícito da vetorização para o processamento paralelo de dados.
- Uma interface SPI (service-provider interface) foi adicionada para a resolução de nomes de hosts e endereços IP, permitindo que java.net.InetAddress utilize resolvedores alternativos, não vinculados aos manipuladores oferecidos pelo sistema operacional.
- Foi proposta a segunda implementação preliminar da API Foreign Function & Memory, que permite que aplicativos interajam com código e dados fora do Java runtime. A nova API permite chamar eficientemente funções que não são executadas na JVM e acessar memória não gerenciada pela JVM. Por exemplo, é possível chamar funções de bibliotecas compartilhadas externas e acessar dados de processo sem usar JNI.
- Foi adicionada a segunda implementação experimental de correspondência por padrão em expressões "switch", permitindo que em rótulos "case" sejam usados 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". 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(); };
- O mecanismo de finalização foi declarado obsoleto e será desativado em uma das próximas versões, assim como os métodos relacionados, como Object.finalize(), Enum.finalize(), Runtime.runFinalization() e System.runFinalization().
- Os coletores de lixo ZGC (Z Garbage Collector), SerialGC e ParallelGC implementaram suporte à deduplicação de strings.
Fonte: opennet.ru
