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 algumas razões. A Oracle reformulou seu modelo de suporte e criou um trem de lançamento que trará atualizações rápidas, aproximadamente a cada 6 meses. Eles mudaram 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.
Nota: O IntelliJ IDEA 2018.2.4 Community Edition já possui suporte para 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 será mais gratuito para uso comercial. Você pode usá-lo em estágios de desenvolvimento, mas para uso comercial, é necessário 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 a partir de janeiro de 2019. Você precisará pagar por mais suporte. Você pode continuar usando-o, mas não receberá patches/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 Open JDK da Oracle ou de outros fornecedores como AdoptOpenJDK, Azul, IBM, Red Hat, etc. Na minha opinião, a menos que você esteja buscando o uso em nível empresarial com disposição para pagar pelas 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 trem de lançamentos no qual uma nova versão seria lançada a cada seis meses, se você estiver usando o Open JDK gratuito da Oracle, precisará atualizá-lo a cada seis meses, já que a Oracle não fornecerá atualizações gratuitas uma vez que a nova versão seja lançada. Isso pode ser desafiador para se adaptar a uma empresa. Pague pelo suporte comercial para a Oracle e migre apenas de uma versão LTS para a próxima versão LTS. Desta forma, você receberá todas as atualizações e suporte para o Java 11 até 2026. Você pode baixar o Java 17 em 2022. Mantenha-se na versão gratuita do Java mesmo após o término do suporte. Embora você não receba 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ê precisará procurar por outras compilações alternativas para continuar usando-os gratuitamente.
Tendo entendido o pacote que o Java 11 traz consigo, vamos agora analisar as características importantes do Java 11 para os 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 pronta para produção do OpenJDK neste 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. Características do Java 11
Algumas das características importantes do Java 11 são:
- Executar Arquivo Java com um único comando
- Novos métodos utilitários na classe String
- Sintaxe de Variável Local para Parâmetros Lambda
- Controle de Acesso Baseado em Aninhamento
- JEP 321: Cliente HTTP
- Ler/Escrever Strings nos Arquivos
- JEP 328: Gravador de Voo
Vamos discutir as novas características introduzidas com o Java 11 pelo Processo JEP.
4.1) Executando Arquivo Java com um Único Comando
Uma grande mudança é que você não precisa compilar o arquivo de origem Java com a ferramenta javac
primeiro. Você pode executar diretamente o arquivo com o comando java e ele é compilado implicitamente. Este recurso está incluído no JEP 330. Aqui está uma prévia dos novos métodos da classe String Java introduzidos no Java 11:
4.2) Métodos da 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()));
}
}
O resultado do código acima é: strip(), stripLeading(), stripTrailing()
strip()
– Remove os espaços em branco do início e do final da string.
Mas já temos trim(). Então, qual é a necessidade de strip()? strip()
é uma evolução “Unicode-aware” de trim()
. Quando trim()
foi introduzido, 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 do código acima é: repeat(int) O método repeat simplesmente repete a string tantas vezes quanto 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, podíamos inferir o tipo da variável a partir da expressão RHS – var lista = new ArrayList<String>();
JEP 323 permite que var
seja usado 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 da maneira acima. Mas se usarmos Reflexão Java, isso resultará em 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 Arquivos 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 arquivos de classe materializáveis, criando uma 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 Sem Operação
Ao contrário do GC do 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 na latência do último recurso.
- Melhorias no throughput do último recurso.
Agora Elipson é bom apenas para ambientes de teste. Isso levará a um OutOfMemoryError em produção e causará a falha das aplicações. O benefício do Elipson é que não há sobrecarga de limpeza de memória. Portanto, ele fornecerá um resultado de teste preciso de desempenho e não podemos mais GC para pará-lo. Nota: Este é um recurso experimental.
4.7) JEP 320: Remover os Módulos Java EE e CORBA
Os módulos já estavam obsoletos no Java 9. Agora eles foram 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: Flight Recorder
O Flight Recorder, que antes costumava ser um complemento comercial no Oracle JDK, agora é de código aberto, uma vez que o Oracle JDK em si não é mais gratuito. JFR é uma ferramenta de perfilamento usada para coletar dados de diagnóstico e perfilamento de um aplicativo Java em execução. Seu impacto de desempenho é negligenciável e geralmente fica abaixo de 1%. Portanto, pode ser usado em aplicativos de produção.
4.9) JEP 321: Cliente HTTP
O Java 11 padroniza a API de Cliente HTTP. A nova API suporta tanto HTTP/1.1 quanto HTTP/2. É projetada para melhorar o desempenho geral do envio de solicitações por um cliente e o recebimento de respostas do servidor. Também oferece suporte nativo a WebSockets.
4.10) Leitura/Gravação de Strings nos Arquivos
O Java 11 se esforça para tornar a leitura e gravação de Strings conveniente. Ele introduziu os seguintes métodos para leitura e gravação nos/arquivos:
- readString()
- writeString()
O código a seguir mostra 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 cifra ChaCha20 e ChaCha20-Poly1305. Esses algoritmos serão implementados no provedor SunJCE.
4.12) JEP 315: Melhorar Intrínsecos Aarch64
Melhorar os intrínsecos existentes de string e matriz, e implementar novos intrínsecos para as funções sin, cos e log de java.lang.Math, em processadores AArch64.
4.13) JEP 333: ZGC: Um Coletor de Lixo de Baixa Latência e Escalável (Experimental)
O Java 11 introduziu um GC de baixa latência. Esta é uma funcionalidade experimental. É bom ver que a Oracle está dando importância aos GCs.
4.14) JEP 335: Depreciar o Motor de JavaScript Nashorn
O motor de script JavaScript Nashorn e APIs estão depreciados, indicando que serão removidos nas próximas versões.
5. Conclusão
Passamos pelos recursos importantes e atualizações fornecidos no Java 11. Até logo, quando o Java 12 for lançado.
Source:
https://www.digitalocean.com/community/tutorials/java-11-features