Recursos do Java 11

Ainda não nos imergimos completamente no Java 10 e o Java 11 já está aqui. O Java 11 é importante por mais do que apenas alguns motivos. A Oracle reformulou seu modelo de suporte e criou um trem de lançamento que trará atualizações rápidas, a cada 6 meses aproximadamente. Eles alteraram o modelo de licenciamento e suporte, o que significa que se você baixar o Oracle JDK Java 11, será pago para uso comercial.

Isso significa que eu preciso pagar pelo Java a partir de agora? NÃO. Não necessariamente, a menos que você baixe o Oracle JDK e o use em produção.

Observação: O IntelliJ IDEA 2018.2.4 Community Edition já oferece suporte para o Java 11.

1. Por que o Java 11 é importante?

O Java 11 é o segundo lançamento LTS após o Java 8. Desde o Java 11, o Oracle JDK não seria mais gratuito para uso comercial. Você pode usá-lo em estágios de desenvolvimento, mas para usá-lo comercialmente, você precisa comprar uma licença. Se não o fizer, você pode receber uma fatura da Oracle a qualquer momento! O Java 10 foi o último Oracle JDK gratuito que poderia ser baixado. A Oracle interrompe o suporte ao Java 8 desde janeiro de 2019. Você precisará pagar por mais suporte. Você pode continuar usando-o, mas não receberá nenhum patch/atualizações de segurança.

A Oracle não fornecerá suporte gratuito de longo prazo (LTS) para nenhuma versão única do Java desde o Java 11.

Embora o Oracle JDK não seja mais gratuito, você sempre pode baixar as compilações do OpenJDK da Oracle ou de outros provedores como AdoptOpenJDK, Azul, IBM, Red Hat, etc. Na minha opinião, a menos que você esteja procurando por uso de nível empresarial com disposição para pagar as taxas de suporte, você pode usar o OpenJDK e atualizá-lo conforme necessário.

2. Qual compilação do JDK devo baixar e quais são os benefícios de cada uma delas?

Já que a Oracle criou um cronograma de lançamento no qual uma nova versão seria lançada a cada seis meses, se você estiver usando o OpenJDK gratuito da Oracle, precisará atualizá-lo a cada seis meses, já que a Oracle não fornecerá atualizações gratuitas assim que a nova versão for lançada. Isso pode ser desafiador para uma empresa se adaptar. Pague pelo suporte comercial à Oracle e migre apenas de uma versão LTS para a próxima versão LTS. Dessa forma, você obterá todas as atualizações e suporte para o Java 11 até 2026. Você pode baixar o Java 17 em 2022. Continue na versão gratuita do Java mesmo após o término do suporte. Embora você não obtenha atualizações de segurança e possa abrir brechas de segurança.

A Oracle não fornecerá suporte comercial ou atualizações para o Java 9 e o Java 10. Você precisa procurar outras compilações alternativas para continuar usando-os gratuitamente.

Tendo compreendido o conjunto de recursos que o Java 11 traz consigo, vamos agora analisar os recursos importantes no Java 11 para desenvolvedores. Também discutiremos alguns JEPs importantes. Observação: o JavaFX estará disponível como um módulo separado e não vinculado ao ciclo de lançamento de 6 meses do Java JDK.

3. Como baixar a versão gratuita do Java 11?

Você pode baixar a versão do OpenJDK pronta para produção a partir deste link. Os binários estão em formato tar ou zip, então basta descompactá-los e configurar as variáveis de ambiente para usar o compilador java e os comandos java.

4. Recursos do Java 11

Alguns dos recursos importantes do Java 11 são:

  • Executar Arquivo Java com um único comando
  • Novos métodos de utilitário na classe String
  • Sintaxe de Variável Local para Parâmetros Lambda
  • Controle de Acesso Baseado em Aninhamento
  • JEP 321: Cliente HTTP
  • Leitura/Escrita de Strings para e a partir de Arquivos
  • JEP 328: Gravador de Voo

Vamos discutir os novos recursos introduzidos com o Java 11 do Processo JEP.

4.1) Executando arquivo Java com um único comando

Uma grande mudança é que você não precisa mais compilar o arquivo de origem Java com a ferramenta javac primeiro. Você pode executar diretamente o arquivo com o comando java e ele compilará implicitamente. Esta funcionalidade faz parte do JEP 330. Segue uma prévia dos novos métodos da classe String Java introduzidos no Java 11:

4.2) Métodos de String Java

isBlank() – Este método de instância retorna um valor booleano. Strings vazias e Strings apenas com espaços em branco são consideradas em branco.

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // Seu código aqui!
        
        System.out.println(" ".isBlank()); //true
        
        String s = "Anupam";
        System.out.println(s.isBlank()); //false
        String s1 = "";
        System.out.println(s1.isBlank()); //true
    }
}

lines() Este método retorna um fluxo de strings, que é uma coleção de todas as substrings divididas por linhas.

import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws Exception {
        
        String str = "JD\nJD\nJD"; 
        System.out.println(str);
        System.out.println(str.lines().collect(Collectors.toList()));
    }
}

A saída do código acima é: strip(), stripLeading(), stripTrailing() strip() – Remove o espaço em branco do início e do final da string.

Mas já temos trim(). Então, qual é a necessidade do strip()? strip() é uma evolução “sensível a Unicode” do trim(). Quando trim() foi introduzido, o Unicode não estava evoluído. Agora, o novo strip() remove todos os tipos de espaços em branco no início e no final (verifique o método Character.isWhitespace(c) para saber se um unicode é um espaço em branco ou não)

Um exemplo usando os três métodos acima é dado abaixo:

public class Main {
    public static void main(String[] args) throws Exception {
        // Seu código aqui!
        
        String str = " JD "; 
        System.out.print("Start");
        System.out.print(str.strip());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripLeading());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripTrailing());
        System.out.println("End");
    }
}

A saída no console a partir do código acima é: repeat(int) O método repeat simplesmente repete a string o número de vezes mencionado no método na forma de um int.

public class Main {
    public static void main(String[] args) throws Exception {
        // Seu código aqui!
        
        String str = "=".repeat(2);
        System.out.println(str); //prints ==
    }
}

4.3) Sintaxe de Variável Local para Parâmetros Lambda

JEP 323, Sintaxe de Variável Local para Parâmetros de Lambda é o único recurso de linguagem lançado no Java 11. No Java 10, Inferência de Tipo de Variável Local foi introduzida. Assim, poderíamos inferir o tipo da variável a partir do RHS – var lista = new ArrayList<String>(); JEP 323 permite o uso de var para declarar os parâmetros formais de uma expressão lambda implicitamente tipada. Agora podemos definir:

(var s1, var s2) -> s1 + s2

Isso já era possível no Java 8, mas foi removido no Java 10. Agora está de volta no Java 11 para manter as coisas uniformes. Mas por que isso é necessário quando podemos simplesmente omitir o tipo na lambda? Se você precisar aplicar uma anotação como @Nullable, você não pode fazer isso sem definir o tipo. Limitação deste recurso – Você deve especificar o tipo var em todos os parâmetros ou nenhum. Coisas como as seguintes não são possíveis:

(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed

var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.

4.4) Controle de Acesso Baseado em Aninhamento

Antes do Java 11, isso era possível:

public class Main {
 
    public void myPublic() {
    }
 
    private void myPrivate() {
    }
 
    class Nested {
 
        public void nestedPublic() {
            myPrivate();
        }
    }
}

O método privado da classe principal é acessível a partir da classe aninhada acima dessa maneira. Mas se usarmos Reflexão Java, ele lançará uma IllegalStateException.

Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);

O controle de acesso aninhado do Java 11 aborda essa preocupação na reflexão. A classe java.lang.Class introduz três métodos na API de reflexão: getNestHost(), getNestMembers() e isNestmateOf().

4.5) JEP 309: Constantes de Arquivo de Classe Dinâmicas

O formato de arquivo de classe Java agora estende o suporte a uma nova forma de pool de constantes, CONSTANT_Dynamic. O objetivo deste JEP é reduzir o custo e a interrupção do desenvolvimento de novas formas de restrições de arquivo de classe materializáveis, criando uma única nova forma de pool de constantes que pode ser parametrizada com comportamento fornecido pelo usuário. Isso melhora o desempenho

4.6) JEP 318: Epsilon: Um Coletor de Lixo No-Op

Ao contrário do coletor de lixo JVM, que é responsável por alocar memória e liberá-la, o Epsilon apenas aloca memória. Ele aloca memória para as seguintes coisas:

  • Testes de desempenho.
  • Testes de pressão de memória.
  • Testes de interface VM.
  • Trabalhos extremamente curtos.
  • Melhorias de latência Last-drop.
  • Melhorias de throughput Last-drop.

Agora, o Elipson é bom apenas para ambientes de teste. Isso levará a um OutOfMemoryError em produção e fará com que os aplicativos falhem. O benefício do Elipson é a ausência de sobrecarga de limpeza de memória. Portanto, ele fornecerá um resultado de teste preciso de desempenho e não podemos mais fazer GC para interrompê-lo. Observação: Esta é uma funcionalidade experimental.

4.7) JEP 320: Remover os Módulos Java EE e CORBA

Os módulos já estavam obsoletos no Java 9. Agora estão completamente removidos. Os seguintes pacotes foram removidos: java.xml.ws, java.xml.bind, java.activation, java.xml.ws.annotation, java.corba, java.transaction, java.se.ee, jdk.xml.ws, jdk.xml.bind

4.8) JEP 328: Gravador de Voo

O Gravador de Voo, que antes costumava ser um complemento comercial no Oracle JDK, agora é de código aberto, já que o Oracle JDK em si não é mais gratuito. JFR é uma ferramenta de perfilagem usada para coletar dados de diagnóstico e perfilamento de uma aplicação Java em execução. Seu overhead de desempenho é negligenciável e geralmente fica abaixo de 1%. Portanto, pode ser usado em aplicações de produção.

4.9) JEP 321: Cliente HTTP

O Java 11 padroniza a API do Cliente HTTP. A nova API suporta tanto HTTP/1.1 quanto HTTP/2. Foi projetada para melhorar o desempenho geral do envio de solicitações por um cliente e recebimento de respostas do servidor. Também oferece suporte nativo para WebSockets.

4.10) Leitura/Escrita de Strings de/para Arquivos

O Java 11 se esforça para tornar a leitura e escrita de String conveniente. Ele introduziu os seguintes métodos para ler e escrever de/para os arquivos:

  • readString()
  • writeString()

O código a seguir demonstra um exemplo disso.

Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on JD

4.11) JEP 329: Algoritmos Criptográficos ChaCha20 e Poly1305

O Java 11 fornece implementações de cifras ChaCha20 e ChaCha20-Poly1305. Esses algoritmos serão implementados no provedor SunJCE.

4.12) JEP 315: Melhorar Intrínsecos Aarch64

Melhorar os intrínsecos de string e array existentes e implementar novos intrínsecos para as funções java.lang.Math sin, cos e log em processadores AArch64.

4.13) JEP 333: ZGC: Um Coletor de Lixo Escalável de Baixa Latência (Experimental)

O Java 11 introduziu um GC de baixa latência. Esta é uma funcionalidade experimental. É bom ver que a Oracle está dando importância para os GCs.

4.14) JEP 335: Depreciar o Motor de JavaScript Nashorn

O motor de script JavaScript Nashorn e APIs estão depreciados, indicando assim que serão removidos nas próximas versões.

5. Conclusão

Passamos pelos recursos e atualizações importantes fornecidos no Java 11. Até breve quando o Java 12 for lançado.

Source:
https://www.digitalocean.com/community/tutorials/java-11-features