Java 22 Conheça as Novidades da nova Versão da Linguagem

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.

java 22

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.

5/5 - (1 vote)

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *