Após seis meses de desenvolvimento, a Oracle lançado uma plataforma JavaSE 14 (Java Platform, Standard Edition 14), o projeto OpenJDK de código aberto é usado como implementação de referência. Java SE 14 mantém compatibilidade retroativa com versões anteriores da plataforma Java; todos os projetos Java escritos anteriormente funcionarão sem alterações quando lançados na nova versão. Compilações Java SE 14 prontas para instalar (JDK, JRE e Server JRE) preparado para Linux (x86_64), Windows e macOS. Implementação de referência desenvolvida pelo projeto OpenJDK Java 14 é totalmente de código aberto sob a licença GPLv2, com exceções GNU ClassPath permitindo vinculação dinâmica com produtos comerciais.
O Java SE 14 é classificado como uma versão de suporte geral e continuará recebendo atualizações até a próxima versão. O branch Long Term Support (LTS) deverá ser o Java SE 11, que continuará recebendo atualizações até 2026. A ramificação LTS anterior do Java 8 terá suporte até dezembro de 2020. O próximo lançamento LTS está agendado para setembro de 2021. Lembramos que a partir do lançamento do Java 10, o projeto passou para um novo processo de desenvolvimento, implicando em um ciclo mais curto para a formação de novos lançamentos. A nova funcionalidade agora é desenvolvida em um branch master constantemente atualizado, que inclui alterações prontas e a partir do qual os branchs são ramificados a cada seis meses para estabilizar novos lançamentos.
Adicionado suporte experimental correspondência de padrões no operador “instanceof”, que permite definir imediatamente uma variável local para acessar o valor verificado. Por exemplo, você pode escrever imediatamente “if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}” sem definir explicitamente “String s = (String) obj”.
Foi:
if (obj instância do grupo) {
Grupo grupo = (Grupo) obj;
var entradas = group.getEntries();
}
Agora você pode dispensar a definição “Group group = (Group) obj”:
if (obj instância do grupo de grupo) {
var entradas = group.getEntries();
}
Adicionado suporte experimental para a nova palavra-chave "registro", que fornece uma forma compacta para definir classes, permitindo evitar a definição explícita de vários métodos de baixo nível, como equals(), hashCode() e toString() em casos onde os dados são armazenados apenas em campos cujo comportamento não muda. Quando uma classe usa implementações padrão dos métodos equals(), hashCode() e toString(), ela pode prescindir de sua definição explícita:
registro público BankTransaction (data LocalDate,
quantidade dupla
Descrição da string) {}
Esta declaração adicionará automaticamente implementações dos métodos equals(), hashCode() e toString() além dos métodos construtor e getter.
Padronizado e o suporte para uma nova forma de expressões “switch” é habilitado por padrão, o que não requer a especificação do operador “break”, permite combinar rótulos repetidos e pode ser usado não apenas como um operador, mas também como um expressão.
var log = switch (evento) {
case PLAY -> “Usuário acionou o botão play”;
case STOP, PAUSE -> “Usuário precisa de uma pausa”;
padrão -> {
String mensagem = event.toString();
LocalDateTime agora = LocalDateTime.now();
rendimento "Evento desconhecido" + mensagem +
» conectado » + agora;
}
};
Suporte experimental expandido blocos de texto - uma nova forma de literais de string que permite incluir dados de texto de várias linhas no código-fonte sem usar escape de caracteres e preservar a formatação do texto original no bloco. O bloco é enquadrado por três aspas duplas. No Java 14, os blocos de texto agora suportam a sequência de escape "\s" para definir um único espaço e "\" para concatenar com a próxima linha (ignorando novas linhas quando você precisa imprimir uma linha muito longa). Por exemplo, em vez do código
O conteúdo informativo do diagnóstico quando ocorrem exceções foi ampliado Null Pointer Exception. Enquanto anteriormente a mensagem de erro se referia apenas ao número da linha, agora ela detalha qual método causou a exceção. Atualmente, os diagnósticos avançados são habilitados apenas quando iniciados com o sinalizador “-XX:+ShowCodeDetailsInExceptionMessages”. Por exemplo, ao especificar este sinalizador, a exceção na linha
var nome = user.getLocation().getCity().getName();
resultará em uma mensagem
Exceção no thread “main” java.lang.NullPointerException: Não é possível invocar “Location.getCity()”
porque o valor de retorno de "User.getLocation()" é nulo
em NullPointerExample.main(NullPointerExample.java:5):5)
o que deixa claro que o método Location.getCity() não foi chamado e User.getLocation() retornou nulo.
Implementado Uma prévia do utilitário jpackage, que permite criar pacotes para aplicativos Java independentes. O utilitário é baseado no javapackager do JavaFX e permite criar pacotes em formatos nativos para diversas plataformas (msi e exe para Windows, pkg e dmg para macOS, deb e rpm para Linux). Os pacotes incluem todas as dependências necessárias.
Para o coletor de lixo do G1 adicionado um novo mecanismo de alocação de memória que leva em consideração as especificidades do trabalho em grandes sistemas usando a arquitetura NUMA. O novo alocador de memória é habilitado usando o sinalizador “+XX:+UseNUMA” e pode melhorar significativamente o desempenho em sistemas NUMA.
Adicionado API para monitoramento em tempo real de eventos JFR (JDK Flight Recorder), por exemplo, para organizar monitoramento contínuo.
Adicionado Módulo jdk.nio.mapmode, que oferece novos modos (READ_ONLY_SYNC, WRITE_ONLY_SYNC) para criar buffers de bytes mapeados (MappedByteBuffer) referenciando memória não volátil (NVM).
Implementado Uma prévia da API de acesso à memória externa, permitindo que aplicativos Java acessem regiões de memória fora do heap Java de forma segura e eficiente, manipulando as novas abstrações MemorySegment, MemoryAddress e MemoryLayout.
Anunciado portas obsoletas para os processadores Solaris OS e SPARC (Solaris/SPARC, Solaris/x64 e Linux/SPARC) com a intenção de remover essas portas no futuro. A descontinuação dessas portas permitirá que a comunidade acelere o desenvolvimento de novos recursos do OpenJDK sem perder tempo mantendo recursos específicos do Solaris e do SPARC.
Removido o coletor de lixo CMS (Concurrent Mark Sweep), que foi marcado como obsoleto há dois anos e permaneceu sem manutenção (o CMS foi substituído há muito tempo pelo coletor de lixo G1). Além do mais, anunciou descontinuado o uso de uma combinação de algoritmos de coleta de lixo ParallelScavenge e SerialOld (executados com as opções “-XX:+UseParallelGC -XX:-UseParallelOldGC”).
O suporte experimental para o coletor de lixo ZGC (Z Garbage Collector) foi fornecido nas plataformas macOS e Windows (anteriormente compatível apenas com Linux). O ZGC opera no modo passivo, minimiza ao máximo a latência devido à coleta de lixo (o tempo de parada ao usar o ZGC não excede 10 ms) e pode trabalhar com heaps pequenos e enormes, variando em tamanho de várias centenas de megabytes a muitos terabytes.
Removido Kit de ferramentas e API para compactação de arquivos JAR usando o algoritmo Pack200.