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

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

Java 8 ao 18: Mudanças mais importantes na plataforma Java

    Vamos rever muitas das mudanças mais importantes na plataforma Java que aconteceram entre a versão 8 (2014) e 18 (2022)   O Java 8 foi lançado em março de 2014 e o Java 18 em março de 2022. São 8 anos de progresso, 203 JEPs (JDK Enhancement Proposals ), entre essas duas versões. Neste post, revisaremos as mudanças mais importantes e discutiremos os benefícios e desafios da adoção de versões mais recentes do JDK para novos aplicativos e para os mais antigos compilados com versões mais antigas. Desde a versão 9, o Java tem novos recursos a cada 6 meses e é muito difícil acompanhar essas novas mudanças. A maioria das informações na internet descreve as mudanças entre as duas últimas versões do Java. No entanto, se você estiver em uma situação semelhante à minha, não está usando uma das versões mais recentes do Java, mas uma das várias versões anteriores (Geralmente 8 ou 11 que são as versões de suporte estendido). Então é útil saber quais novos recursos foram adicionados d

O suporte de longo prazo e o que o LTS significa para o ecossistema Java

A arte do suporte de longo prazo e o que o LTS significa para o ecossistema Java Aqui está o que o Java 17 tem em comum com o Java 11 e o Java 8. Em junho de 2018, há pouco mais de três anos, a Oracle e outros participantes do ecossistema Java anunciaram uma mudança no modelo de cadência de lançamento para Java SE. Em vez de ter um lançamento principal planejado a cada dois ou quatro anos (que geralmente se torna de três a quatro anos), um novo modelo de lançamento de recursos de seis meses seria usado: a cada três anos, um lançamento seria designado como Long-Term Support (LTS) e receba apenas atualizações trimestrais de segurança, estabilidade e desempenho. Esse padrão foi emprestado descaradamente do modelo de lançamento do Mozilla Firefox, mas o ajustou para ficar mais alinhado com os requisitos de uma plataforma de desenvolvimento. A primeira versão do Java lançada sob esse modelo foi o Java SE 11. O lançamento do Java SE 17, o segundo lançamento do LTS sob o novo