Versão Java SE 14

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.

De inovações Java 14 uma lata marca:

  • 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

    Stringhtml = " » +
    "\n\t" + " » +
    "\n\t\t" + " \"Java 1 chegou!\" » +
    "\n\t" + " » +
    "\n" + " ";

    você pode especificar:

    Stringhtml = """


    »Java 1\
    é aqui!

    """;

  • 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.

Fonte: opennet.ru

Adicionar um comentário