Pular para o conteúdo principal

Diferenças entre o Java 11 e Java 17 - Text Blocks e Switch Expressions

  



Diferenças entre Java 11 e 17 - Text Blocks e Switch Expressions


Aprenda as diferenças entre o Java 11 e o Java 17. Obtenha uma visão geral do modelo de licenciamento e exemplos dos novos recursos do Java 17. Neste primeiro post vamos falar sobre Text Blocks e Switch Expressions.


Em 14 de setembro, o Java 17 foi lançado. É hora de dar uma olhada mais de perto nas mudanças desde o último lançamento do LTS, que é o Java 11. É feita uma breve introdução sobre o modelo de licenciamento e, em seguida, algumas das mudanças entre o Java 11 e o Java 17 são destacadas, principalmente por meio de exemplos.


Introdução


Primeiro, vamos dar uma olhada no modelo de licenciamento e suporte Java. O Java 17 é uma versão LTS (Long Term Support), assim como o Java 11. Com o Java 11, uma nova cadência de lançamento começou. Java 11 veio com suporte até setembro de 2023 e com suporte estendido até setembro de 2026. Além disso, com o Java 11, o Oracle JDK não era mais gratuito para produção e uso comercial. A cada 6 meses, uma nova versão do Java é lançada, os chamados não-LTS, desde o Java 12 até o Java 16. No entanto, esses são lançamentos prontos para produção. A única diferença com um lançamento LTS é que o suporte termina quando a próxima versão for lançada. Por exemplo, o suporte do Java 12 termina quando o Java 13 é lançado.


Você é mais ou menos obrigado a atualizar para o Java 13 quando quiser manter o suporte a atualizações e correção de bugs. Isso pode causar alguns problemas quando algumas de suas dependências ainda não estão prontas para o Java 13.


Na maioria das vezes, para uso em produção, as empresas esperam pelos lançamentos LTS. Mas, mesmo assim, algumas empresas relutam em fazer upgrade. Uma pesquisa recente da Snyk mostrou que apenas 60% estão usando o Java 11 em produção e isso foi 3 anos após o lançamento do Java 11! O Java 8 também ainda é usado por 60% das empresas. Outra coisa interessante de se notar é que o próximo lançamento do LTS será o Java 21, que será lançado em 2 anos. Uma boa visão geral se as bibliotecas têm problemas ou não com o Java 17, pode ser encontrada aqui.


O modelo de licenciamento da Oracle mudou com a introdução do Java 17. Java 17 é emitido sob a nova licença NFTC (Oracle No-Fee Terms and Conditions). Portanto, é novamente permitido usar a versão Oracle JDK gratuitamente para produção e uso comercial. Na mesma pesquisa da Snyk, constatou-se que a versão Oracle JDK só era usada por 23% dos usuários em ambiente de produção. Você deve observar que o suporte para a versão LTS terminará um ano após o lançamento da próxima versão LTS. Será interessante ver como isso influenciará a atualização para as próximas versões LTS. Você pode ver um texto mais completo aqui.


O que mudou entre o Java 11 e o Java 17? Uma lista completa dos JEPs (Java Enhancement Proposals) pode ser encontrada no site do OpenJDK. Aqui você pode ler os detalhes essenciais de cada JEP. Para obter uma lista completa do que mudou por versão desde o Java 11.


Nas próximas seções, algumas das mudanças serão explicadas, por exemplo, mas depende principalmente de você experimentar esses novos recursos para se familiarizar com eles.


Text Blocks


Muitas melhorias foram feitas para tornar o Java mais legível e menos prolixo. Os blocos de texto definitivamente tornam o código mais legível. Primeiro, vamos dar uma olhada no problema. Suponha que você precise de alguma string JSON em seu código e precise imprimi-la. Existem vários problemas com este código:

  • Scape das aspas duplas;
  • Concatenação de strings para torná-los mais ou menos legíveis;
  • Copiar e colar JSON exige muito trabalho (provavelmente seu IDE o ajudará com esse problema).

Os blocos de texto são definidos com três aspas duplas, onde as três aspas duplas finais podem não estar na mesma linha da inicial.
private static void oldStyle() {
String text = "{\n" +
" \"name\": \"John Doe\",\n" +
" \"age\": 45,\n" +
" \"address\": \"Doe Street, 23, Java Town\"\n" +
"}";
System.out.println(text);
}
A parte problemática do JSON agora pode ser escrita da seguinte maneira, que é muito mais legível. Não há necessidade de escapar as aspas duplas e parece que será impresso.
private static void jsonBlock() {
String text = """
{
"name": "John Doe",
"age": 45,
"address": "Doe Street, 23, Java Town"
}
""";
System.out.println(text);
}
A saída agora imprime dois espaços antes de cada linha. Isso significa que as três aspas duplas finais indicam o início do Bloco de Texto.

Switch Expressions

Switch Expressions permitirá que você retorne valores do switch e use esses valores de retorno em atribuições, etc. Um switch clássico é mostrado aqui, onde, dependendo de um determinado valor Fruit enum, alguma ação precisa ser realizada. De propósito, o intervalo é deixado de fora.

Chame o método com APPLE.
oldStyleWithoutBreak(Fruit.APPLE);
Isso imprime todos os casos porque, sem a instrução break, o caso falha.
Common fruit
Exotic fruit
Undefined fruit

Portanto, é necessário adicionar uma instrução break em cada caso para evitar essa falha.
private static void oldStyleWithBreak(Fruit fruit) {
switch (fruit) {
case APPLE, PEAR:
System.out.println("Common fruit");
break;
case ORANGE, AVOCADO:
System.out.println("Exotic fruit");
break;
default:
System.out.println("Undefined fruit");
}
}
A execução desse método fornece o resultado desejado, mas o código está um pouco menos legível agora.

Common fruit

Isso pode ser resolvido usando Switch Expressions. Substitua os dois pontos (:) por uma seta (->) e certifique-se de que uma expressão seja usada nesse caso. O comportamento padrão de Switch Expressions é sem falhas, portanto, nenhum break é necessário.

private static void withSwitchExpression(Fruit fruit) {
switch (fruit) {
case APPLE, PEAR -> System.out.println("Common fruit");
case ORANGE, AVOCADO -> System.out.println("Exotic fruit");
default -> System.out.println("Undefined fruit");
}
}
Isso já é menos verboso e o resultado é idêntico. Uma expressão de switch também pode retornar um valor. No exemplo acima, você pode retornar os valores de String e atribuí-los a um texto variável. Depois disso, a variável de texto pode ser impressa. Não se esqueça de adicionar um ponto e vírgula após o último colchete.

private static void withReturnValue(Fruit fruit) {
String text = switch (fruit) {
case APPLE, PEAR -> "Common fruit";
case ORANGE, AVOCADO -> "Exotic fruit";
default -> "Undefined fruit";
};
System.out.println(text);
}
E, ainda mais resumido, o acima pode ser reescrito em apenas uma declaração. Depende de você se isso é mais legível do que o acima.

private static void withReturnValueEvenShorter(Fruit fruit) {
System.out.println(
switch (fruit) {
case APPLE, PEAR -> "Common fruit";
case ORANGE, AVOCADO -> "Exotic fruit";
default -> "Undefined fruit";
});
}

O que você faz quando precisa fazer mais do que apenas uma coisa no caso? Neste caso, você pode usar colchetes para indicar um bloco de caso e ao retornar um valor, você usa a palavra-chave yield.

private static void withYield(Fruit fruit) {
String text = switch (fruit) {
case APPLE, PEAR -> {
System.out.println("the given fruit was: " + fruit);
yield "Common fruit";
}
case ORANGE, AVOCADO -> "Exotic fruit";
default -> "Undefined fruit";
};
System.out.println(text);
}
A saída agora é um pouco diferente, duas instruções de impressão são executadas.

the given fruit was: APPLE Common fruit

Também é legal que você possa usar a palavra-chave yield na 'antiga' sintaxe de switch. O break não é necessário aqui.
private static void oldStyleWithYield(Fruit fruit) {
System.out.println(switch (fruit) {
case APPLE, PEAR:
yield "Common fruit";
case ORANGE, AVOCADO:
yield "Exotic fruit";
default:
yield "Undefined fruit";
});
}
No próximo post continuaremos a explorar outras diferenças . Até lá.


Créditos e artigo original (em inglês)



Comentários

Postagens mais visitadas deste blog

Certificação Java 11 - O que mudou

Certificação Java 11 - O que mudou A Oracle liberou recentemente uma atualização das suas certificações Java para atender a nova versão Java 11  LTS (Long Term Support) . Mas o que muda em relação a certificação Java 8? Preciso me atualizar? Por onde começo?  Neste post, vamos responder estas e outras questões sobre essa nova série de certificações. Caso você não tenha acompanhado a série sobre certificação, recomendo a leitura dos posts anteriores: https://www.guiadojava.com.br/2018/06/guia-da-certificacao-java-se-8.html Também temos um bate papo com os maiores especialistas de Java do mercado. Assista o replay aqui: https://events.genndi.com/replay/169105139238448348/23a5b3a7b0/0/83729443273C Nomenclatura e requisitos A partir de agora, você não receberá o certificado se fizer apenas a primeira prova, como era no Java 8 (1Z0-808 - Java SE 8 Programmer I). Você terá que fazer duas provas para obter o certificado " Oracle Certified Professional: Java SE 11 Dev

JDK 18: Os novos recursos do Java 18

JDK 18: Os novos recursos do Java 18 Com o lançamento em março, o Java 18 incuba uma API vetorial , disponibiliza o “pattern matching for switch statements” como preview feature, adota UTF-8 como o conjunto de caracteres padrão e inclui um servidor web simples. O Java Development Kit (JDK) 18 está programado para ser lançado em 22 de março de 2022. A nova versão do Java padrão terá nove novos recursos, com o conjunto de recursos congelado em 9 de dezembro. O JDK 18 passou para um estágio de release candidate, após duas fases de rampdown realizadas entre dezembro e fevereiro. Um segundo release candidate está previsto para 24 de fevereiro. As atualizações do Java padrão são lançadas a cada seis meses, com a versão mais recente, JDK 17 , chegando em setembro de 2021. A página OpenJDK lista os seguintes recursos como direcionados oficialmente ao JDK 18: uma interface de provedor de serviços, um servidor web simples, uma terceira incubação da API vetorial, trechos de código, uma

Java Records

  Java Records Imutável, Simples e limpa Esta funcionalidade da linguagem apareceu pela primeira vez na versão 14 como experimental e assim continuou até a versão 15 . Agora liberada de forma definitiva no Java 16 . O objetivo é ser possível ter classes que atuam como portadores transparentes de dados imutáveis. Os registros podem ser considerados tuplas nominais. Ou seja, após criado, um record não pode mais ser alterado. Records oferece uma uma sintaxe compacta para declarar classes que são portadores transparentes para dados imutáveis superficiais visando reduzir significamente o detalhamento dessas classes e irá melhorar a capacidade de leitura e manutenção do código. Vamos seguir um exemplo de uma classe chamada Pessoa . O primeiro exemplo vamos utilizar o modo tradicional. public class Pessoa { private String nome; private int idade; public Pessoa (String nome, int idade) { super (); this .nome = nome; this .idade = idade; } public String getNo