A Oracle lança o Java 22, marcando mais um passo ousado na evolução da linguagem de programação e plataforma de desenvolvimento mais amplamente utilizada do mundo.
O Java 22, também conhecido como Oracle JDK 22, traz consigo uma miríade de melhorias, totalizando 12 Propostas de Aprimoramento do JDK (JEPs), destinadas a impulsionar a linguagem Java e otimizar o desempenho, estabilidade e segurança da plataforma de desenvolvimento.
Esta nova versão não apenas capacita os desenvolvedores a serem mais produtivos, mas também abre novas fronteiras de inovação, preparando o terreno para um crescimento acelerado em organizações em todo o mundo.
Avanços no Java 22
O Java 22 traz uma série de aprimoramentos significativos, destacando-se entre eles os recursos provenientes dos projetos Amber, Loom e Panama. Aqui está um panorama dos principais avanços:
Recursos do Projeto Amber:
Conheça abaixo os principais recursos que foram aprimorados a versão:
JEP 447: Declarações antes do super
Este recurso concede aos desenvolvedores uma maior flexibilidade ao expressar o comportamento dos construtores, permitindo que declarações que não se referem à instância em criação apareçam antes de uma invocação explícita do construtor.
Os construtores em Java têm uma regra rígida: se houver uma invocação explícita do construtor em um corpo de construtor, ela deve ser a primeira instrução. Isso foi projetado para garantir que a inicialização dos objetos ocorra de cima para baixo, evitando acessos a campos não inicializados.
Embora essas regras sejam eficazes na garantia da integridade dos objetos, elas também limitam a expressividade do código e exigem soluções contornadas para cenários comuns.
Imagine uma situação em que você precisa validar argumentos antes de chamar o construtor da superclasse. Atualmente, você precisaria usar métodos auxiliares estáticos, o que pode parecer desajeitado. Por exemplo:
package br.com.virandoprogramador.java22 public class PositiveBigInteger extends BigInteger { public PositiveBigInteger(long value) { super(verifyPositive(value)); } private static long verifyPositive(long value) { if (value <= 0) throw new IllegalArgumentException("non-positive value"); return value; } }
No entanto, seria mais natural e legível se pudéssemos fazer a validação diretamente no construtor:
package br.com.virandoprogramador.java22 public class PositiveBigInteger extends BigInteger { public PositiveBigInteger(long value) { if (value <= 0) throw new IllegalArgumentException("non-positive value"); super(value); } }
Outro cenário comum é preparar argumentos para o construtor da superclasse. Novamente, a solução atual envolve métodos auxiliares, como mostrado abaixo:
package br.com.virandoprogramador.java22 public class Sub extends Super { public Sub(Certificate certificate) { super(prepareByteArray(certificate)); } // Auxiliary method private static byte[] prepareByteArray(Certificate certificate) { var publicKey = certificate.getPublicKey(); if (publicKey == null) throw new IllegalArgumentException("null certificate"); return switch (publicKey) { case RSAKey rsaKey -> ... case DSAPublicKey dsaKey -> ... ... default -> ... }; } }
Outro cenário comum é preparar argumentos para o construtor da superclasse. Novamente, a solução atual envolve métodos auxiliares, como mostrado abaixo:
package br.com.virandoprogramador.java22 public class Sub extends Super { public Sub(Certificate certificate) { super(prepareByteArray(certificate)); } // Auxiliary method private static byte[] prepareByteArray(Certificate certificate) { var publicKey = certificate.getPublicKey(); if (publicKey == null) throw new IllegalArgumentException("null certificate"); return switch (publicKey) { case RSAKey rsaKey -> ... case DSAPublicKey dsaKey -> ... ... default -> ... }; } }
Seria mais elegante se pudéssemos incorporar a lógica de preparação de argumentos diretamente no construtor:
package br.com.virandoprogramador.java22 public class Sub extends Super { public Sub(Certificate certificate) { var publicKey = certificate.getPublicKey(); if (publicKey == null) throw new IllegalArgumentException("null certificate"); final byte[] byteArray = switch (publicKey) { case RSAKey rsaKey -> ... case DSAPublicKey dsaKey -> ... ... default -> ... }; super(byteArray); } }
Esses exemplos mostram como as restrições atuais dos construtores em Java podem dificultar a escrita e a manutenção do código. A proposta de permitir instruções antes de invocações explícitas de construtores visa tornar o código mais expressivo e natural, sem comprometer a integridade e a segurança dos objetos.
Com essa mudança, os desenvolvedores teriam mais liberdade para expressar o comportamento dos construtores, facilitando a validação, preparação e compartilhamento de argumentos. Em última análise, isso levaria a um código mais limpo, legível e fácil de manter.
JEP 456: Variáveis e padrões sem nome
Elevando a produtividade do desenvolvedor, este JEP aprimora a legibilidade e manutenção do código, introduzindo variáveis e padrões sem nome quando necessário, mas não usados.
O recurso de variáveis sem nome permite declarar variáveis que não têm um nome associado, indicadas pelo caracter de sublinhado (_). Isso é útil em situações onde o efeito colateral é mais importante que o resultado, como em loops ou tratamento de exceções.
Por exemplo, em um loop onde apenas o número de iterações é relevante, podemos utilizar uma variável sem nome para evitar avisos de variáveis não utilizadas:
package br.com.virandoprogramador.java22 static int count(Iterable<Order> orders) { int total = 0; for (Order _ : orders) // Variável sem nome total++; return total; }
Da mesma forma, em situações onde o resultado de uma expressão é ignorado, como ao remover elementos de uma fila, podemos utilizar variáveis sem nome para denotar que o resultado não é relevante para nosso código:
package br.com.virandoprogramador.java22 Queue<Integer> q = ... // x1, y1, z1, x2, y2, z2, ... while (q.size() >= 3) { var x = q.remove(); var y = q.remove(); var _ = q.remove(); // Variável sem nome ... new Point(x, y) ... }
Além disso, o recurso de padrões sem nome melhora a legibilidade ao permitir a omissão de variáveis em padrões de tipo, especialmente em casos como switch statements ou instanceof expressions.
Por exemplo, podemos simplificar um switch statement que examina o tipo de uma variável utilizando padrões sem nome:
package br.com.virandoprogramador.java22 switch (box) { case Box(RedBall _), Box(BlueBall _) -> processBox(box); case Box(GreenBall _) -> stopProcessing(); case Box(_) -> pickAnotherBox(); }
Esses exemplos demonstram como as variáveis e padrões sem nome proporcionam uma maneira elegante e eficaz de expressar a intenção do desenvolvedor de forma clara e concisa, melhorando assim a manutenção e a robustez do código Java.
Com esses aprimoramentos, a linguagem Java continua a se manter relevante e poderosa no mundo do desenvolvimento de software.
JEP 459: Modelos de string (segunda prévia)
Simplifica a composição de strings, facilitando a inclusão de valores calculados em tempo de execução, enquanto melhora a segurança e legibilidade do código.
Recursos do Projeto Loom:
- JEP 462: Concorrência estruturada (segunda prévia): Introduz uma API para simultaneidade estruturada, otimizando o tratamento de erros e a observabilidade do código simultâneo.
- JEP 464: Valores com escopo (segunda prévia): Facilita o compartilhamento de dados imutáveis entre threads, aumentando a facilidade de uso e compreensão do código.
Recursos do Projeto Panama:
- JEP 454: API de Função Externa e Memória: Aumenta a interoperabilidade entre Java e códigos externos, possibilitando a invocação eficiente de funções externas e acesso seguro à memória externa.
- JEP 460: API de Vetor (sétimo incubador): Oferece um desempenho superior a cálculos escalares equivalentes, compilando instruções vetoriais em tempo de execução em arquiteturas de CPU compatíveis.
Além disso, o Java 22 apresenta melhorias em bibliotecas essenciais e ferramentas, como API de Arquivo de Classe, lançamento de programas de código-fonte múltiplo e Gatherers de Fluxo.
As atualizações de desempenho, incluindo o Pregueamento de Região para G1, prometem reduzir a latência e melhorar a eficiência da coleta de lixo.
Impulsionando a Inovação na Nuvem
O Java 22 não apenas revoluciona o desenvolvimento local, mas também promove a inovação na nuvem, especialmente na Oracle Cloud Infrastructure (OCI).
Ao oferecer o Oracle Java SE e GraalVM gratuitamente na OCI, o Java 22 capacita os desenvolvedores a criar e implantar aplicações com melhor desempenho e eficiência na nuvem.
Adoção Global e Reconhecimento da Comunidade
A comunidade Java recebe calorosamente o Java 22, reconhecendo seu papel crucial na simplificação da linguagem e no impulsionamento da inovação.
Evren Tan, líder da Türkiye Java Community, destaca o contínuo apoio da Oracle ao desenvolvimento, enquanto Badr El Hourari, da xHub, expressa sua animação com os recursos que facilitam a adoção do Java por novos desenvolvedores.
Mala Gupta, da JetBrains, elogia a abordagem minimalista do Java 22, tornando-o acessível a uma ampla gama de programadores. Will Lyons, da Oracle, destaca os benefícios do Java 22 para os usuários do Helidon, enfatizando seu aumento no desempenho e na produtividade.
Conclusão sobre o Java 22
Com o Java 22, a Oracle mais uma vez demonstra seu compromisso com a excelência na programação, capacitando os desenvolvedores a alcançar novos patamares de inovação e eficiência.
Com uma série de aprimoramentos, essa nova versão promete transformar a maneira como as aplicações são desenvolvidas, implantadas e executadas, consolidando ainda mais a posição do Java como a principal escolha para desenvolvedores e organizações em todo o mundo.