A revisão mais recente do Java apresenta algumas sintaxes úteis para registros, entre outras melhorias.
O mundo da programação Java está em constante evolução, exigindo que você se mantenha atualizado para se destacar em seu ofício.
O Java 21 traz uma onda de aprimoramentos empolgantes que revolucionam a maneira como você aborda a simultaneidade, as operações de coleta e o trabalho com registros.
Apresentando tópicos virtuais
O dimensionamento de aplicativos de servidor sempre apresentou desafios, com os encadeamentos frequentemente se tornando gargalos. O número limitado de threads, combinado com a espera frequente de eventos ou bloqueios para desbloquear, prejudica o desempenho geral.
No passado, abordar esse problema envolvia o uso de construções como CompletableFuture ou estruturas reativas, resultando em um código complicado que era difícil de compreender e manter.
Felizmente, o Java 19 introduziu encadeamentos virtuais como um recurso de visualização, que o Java 21 refinou e solidificou por meio da Proposta de aprimoramento 444 do JDK.
Os threads virtuais oferecem uma alternativa altamente promissora, permitindo que você enfrente os desafios de escalabilidade com mais eficiência. Isso leva a um melhor desempenho e maior capacidade de resposta dos aplicativos do servidor.
Coleções sequenciadas são mais utilizáveis
Tradicionalmente, usando listas encadeadas em sua programação Java exigiu um código bastante detalhado. Por exemplo, para buscar o último elemento, você deve usar esta abordagem complicada:
var último = lista.get (lista.tamanho() - 1);
No entanto, o Java 21 apresenta uma alternativa concisa e elegante:
var último = lista.getLast();
Da mesma forma, acessar o primeiro elemento de um LinkedHashSet requer uma rota indireta:
var primeiro = linkedHashSet.iterator().next();
Mas com o Java 21, essa tarefa se torna muito mais simples:
var primeiro = linkedHashSet.getFirst();
Você também pode acessar o último elemento de um LinkedHashSet usando o novo Obtenha o último método que evita a iteração por todo o conjunto.
Essas melhorias nas coleções sequenciadas não apenas aprimoram a legibilidade do código, mas também agilizam a recuperação de elementos, tornando a programação Java mais eficiente e amigável ao desenvolvedor.
Padrões de registro para conveniência
Padrões de registro, introduzidos como um recurso de visualização no Java 19, oferecem um mecanismo conveniente para acessar os campos de um registro em Java sem a necessidade de conversões ou métodos de acesso explícitos.
Eles sinergizam com Correspondência de padrões para instanceof e Correspondência de padrão para switch, simplificando significativamente o código e melhorando a legibilidade geral.
Aqui está uma ilustração deste conceito, com um registro simples chamado Posição:
público registro Posição(int x, int y){}
Anteriormente, a execução de diferentes ações com base na classe de um objeto exigia o uso Correspondência de padrões para instanceof, conforme exemplificado no trecho de código a seguir:
públicovazioimprimir(Objeto){
se (o instancia de Posição p) {
System.out.printf("o é uma posição: %d/%d%n", p.x(), p.y());
} outrose (o instancia de Cordas) {
System.out.printf("o é uma string: %s%n", s);
} outro {
System.out.printf("o é outra coisa: %s%n", o);
}
}
Com Padrões de Gravação, agora você pode corresponder diretamente a um padrão de registro, como Posição (int x, int y) em vez de usar o Posição p padrão. Isso permite que você acesse as variáveis x e y diretamente no código, eliminando a necessidade de p.x() e p.y():
públicovazioimprimir(Objeto){
se (o instancia dePosição(int x, int y)) {
System.out.printf("o é uma posição: %d/%d%n", x, y);
} outrose (o instancia de Cordas) {
System.out.printf("o é uma string: %s%n", s);
} outro {
System.out.printf("o é outra coisa: %s%n", o);
}
}
Além disso, você pode usar Padrões de Gravação em conjunção com Correspondência de padrão para switch, para simplificar ainda mais seu código:
públicovazioimprimir(Objeto){
trocar (o) {
casoPosição(int x, int y) -> System.out.printf("o é uma posição: %d/%d%n", x, y);
caso String s -> System.out.printf("o é uma string: %s%n", s);
padrão - > System.out.printf("o é outra coisa: %s%n", o);
}
}
Padrões de registro aninhados permitem que você corresponda em registros cujos campos são eles próprios registros. Por exemplo, considere um registro chamado Caminho que compreende um de e para posição:
público registro Caminho(Posição de, Posição para){}
Empregando padrões de registro, imprimindo um Caminho objeto torna-se mais conciso:
públicovazioimprimir(Objeto){
trocar (o) {
casoCaminho(Posição de, Posição para) -> System.out.printf("o é um caminho: %d/%d -> %d/%d%n", de.x(), de.y(), para.x(), para.y());
// outros casos
}
}
Com o auxílio de Padrões de Gravação, a manipulação de registros com campos de diferentes tipos fica mais evidente e legível. Suponha que você modificou registros, Position2D e Posição3D, onde Posiçãoé uma interface Java que ambos implementam:
público selado interfacePosiçãopermitemPosition2D, Posição3D{}
público registro Position2D(int x, int y) implementa posição {}
público registro Posição3D(int x, int sim, int z) implementa posição {}
público caminho do registro < P estende a posição > (P de, P para) {}
Para diferenciar o comportamento de impressão para caminhos 2D e 3D, você pode usar padrões de gravação:
públicovazioimprimir(Objeto){
trocar (o) {
casoCaminho(Posição2D de, Posição2D para) -> System.out.printf("o é um caminho 2D: %d/%d -> %d/%d%n", de.x(), de.y(), para.x(), para.y());
casoCaminho(Position3D de, Position3D para) -> System.out.printf("o é um caminho 3D: %d/%d/%d -> %d/%d/%d%n", de.x(), de.y(), de.z(), para.x(), para.y(), para.z());
// outros casos
}
}
Os padrões de registro reduzem significativamente a verbosidade e aprimoram a legibilidade do código ao lidar com registros contendo campos de diversos tipos.
Desbloqueie novas possibilidades com o Java 21
O Java 21 apresenta uma série de recursos poderosos que aumentam os recursos da linguagem de programação Java. Ao adotar esses aprimoramentos, você pode simplificar seus processos de desenvolvimento e desbloquear novas possibilidades para seus aplicativos.
Manter-se atualizado com os recursos de linguagem e as estruturas Java mais recentes permite que você mantenha um código eficiente e sustentável, garantindo que você permaneça na vanguarda da programação Java.