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
- 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).
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);
}
private static void jsonBlock() {
String text = """
{
"name": "John Doe",
"age": 45,
"address": "Doe Street, 23, Java Town"
}
""";
System.out.println(text);
}
Switch Expressions
oldStyleWithoutBreak(Fruit.APPLE);
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");
}
}
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");
}
}
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);
}
private static void withReturnValueEvenShorter(Fruit fruit) {
System.out.println(
switch (fruit) {
case APPLE, PEAR -> "Common fruit";
case ORANGE, AVOCADO -> "Exotic fruit";
default -> "Undefined fruit";
});
}
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);
}
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";
});
}
Créditos e artigo original (em inglês)
Comentários
Postar um comentário