Como uma das linguagens mais utilizadas em todo o mundo, o Java se destaca na área da Programação.
E, para os profissionais de desenvolvimento Java e clientes que o usam sob uma licença comercial, a Oracle trouxe esse ano uma grande notícia. O Java 17 é o mais recente lançamento de Suporte de Longo Prazo (LTS).
Anunciado em 13 de setembro de 2022, o lançamento trouxe diversas melhorias para essa linguagem, propiciando uma melhoria no desenvolvimento e desempenho do Java.
Além das novidades trazidas ao Java 17, foi iniciada uma onda de revoluções para melhorias e implementações futuras, como o project Loom, Paynara, Piranha e outros.
Veja a seguir um pouco mais sobre esse lançamento e as principais novidades da linguagem!
Neste artigo você vai ver:
O que é Java e para que serve o Java 17
Criado na década de 90, o Java é uma linguagem de programação criada na década, por James Gosling. Atualmente, pertence à Oracle, que é responsável por todos os processos de manutenção de atualização.
Java é uma linguagem bastante flexível, por isso, pode ser aplicado usado em diferentes lugares e situações, incluindo softwares e aplicativos.
Inclusive, ele pode ser usado para desenvolver softwares que podem ser executados e distribuídos em diferentes plataformas, sem a necessidade de modificá-lo.
Aqui vai uma curiosidade!
Inicialmente, a linguagem de programação foi chamada de Oak (carvalho). Como o nome já estava registrado, “Java” surgiu como ideia. A explicação é bem interessante: “Java” era o nome da terra de origem do café que os programadores da equipe apreciavam em uma cafeteria local, em San Hill Road.
Isso explica o logo do Java, que se você ainda reparou, nada mais é que um café!
Confira as novidades da nova versão do Java 17
Pattern Matching
Esse foi mais um grande passo para as melhorias na associação de padrões no uso de expressões switch e statements, diminuindo consideravelmente códigos conhecidos como Boilerplate, ou seja, que se repetem com frequência, e aumentando a legibilidade do código.
Agora, após a associação de um tipo de objeto, não é mais necessário fazer o parsing ou atribuição para a manipulação daquele objeto como objeto alvo. Dentro do escopo de declaração abaixo coloco dois exemplos de como é possível ser feito a partir do Java 17.
Sealed Classes
As Sealed Classes são partes do projeto Amber, que continua sua implementação para novas melhorias nas versões futuras do Java, apesar dessa feature ter vindo como preview nas versões 15 e 16 do Java, ela sofreu grande impacto com pattern matching e demais melhorias, fazendo sua versão “definitiva” vir na 17.
O recurso restringe quais outras classes ou interfaces podem estender ou implementar um componente “sealed”. Mostrar mais uma melhoria relacionada à correspondência de padrões combinada com o JEP 406 (Pattern Matching) permitirá uma inspeção mais sofisticada e limpa do padrão de código de tipo cast e act.
Abaixo há um exemplo de uma sealed class e do uso dessa feature em um matching.
Foreign Function and Memory API (Incubator) (JEP 412)
Essa feature permite que os desenvolvedores acessem códigos fora da JVM e acessem memória fora do Heap, seu principal objetivo é remover a antiga JNI API, melhorando bruscamente a segurança e a performance quando comparado com a API antiga.
Abaixo temos um exemplo muito bacana, retirado do blog da Baeldung, em que mostra o acesso a uma biblioteca em C.
Primeiro, é necessário carregar a biblioteca que queremos utilizar via a API, em seguida devemos especificar a assinatura do método alvo e então chamá-lo como no exemplo abaixo:
Vector API (Second Incubator) (JEP 414)
O objetivo principal dessa feature é possibilitar que desenvolvedores produzam código de maneira mais performática e eficiente, aproveitando ao máximo o potencial do hardware adjacente para cálculos.
A Vector API lida com o tipo de operação SIMD (Single Instruction, Multiple Data), ou seja, vários conjuntos de instruções executadas em paralelo. Ela aproveita o hardware de CPU especializado que suporta instruções vetoriais e permite a execução de instruções como pipelines.
Casos de uso diário para esta operação são aplicações lineares de álgebra científica, processamento de imagem, processamento de caracteres e qualquer aplicação aritmética pesada ou qualquer aplicação que precise aplicar uma operação para vários operandos independentes.
Abaixo há uma exemplificação utilizando a multiplicação entre vetores simples.
Novo Pipeline de renderização nos MacOS
A API Java 2D, usada pelas APIs Swing para renderização, agora pode usar a nova API de renderização acelerada Apple Metal para macOS.
No momento, isso está desabilitado por padrão, portanto, a renderização ainda usa APIs OpenGL, que foram preteridas pela Apple, mas ainda estão disponíveis e com suporte.
Para habilitar o Metal, um aplicativo deve especificar seu uso definindo a propriedade do sistema: -Dsun.java2d.metal=true
O uso de Metal ou OpenGL é transparente para os aplicativos, pois é uma diferença de implementação interna e não tem efeito nas APIs Java. O pipeline de Metal requer o macOS 10.14.x ou posterior. As tentativas de configurá-lo em versões anteriores serão ignoradas.
Unified Logging Supports Asynchronous Log Flushing
Para evitar atrasos indesejáveis em um encadeamento usando o log unificado, o usuário agora pode solicitar que o sistema de log unificado opere no modo assíncrono. Isso é feito passando a opção de linha de comando -Xlog:async. No modo assíncrono, os sites de log enfileiram todas as mensagens em um buffer. Um thread autônomo é responsável por liberá-las para as saídas correspondentes. O buffer intermediário é limitado. Na exaustão do buffer, a mensagem de enfileiramento é descartada. O usuário pode controlar o tamanho do buffer intermediário usando a opção de linha de comando -XX:AsyncLogBufferSize=<bytes>
Sealed Classes
O Java 17 também trouxe um tipo especial de classes a Sealed Classes, essas classes permitem especificar quais outras classes podem estendê-las, em outras palavras, declarar uma classe ou interface como selada permite controlar as classes ou interfaces que podem estendê-la ou implementá-la.
Fonte: https://blogs.oracle.com/javamagazine/post/java-sealed-classes-fight-ambiguity
Como é possível notar pela imagem acima, há um conjunto hierárquico com exemplos de como utilizar a sealed class.
O objetivo desse recurso de linguagem é permitir que você controle as possíveis hierarquias em seu domínio de negócios de maneira declarativa. Mas por que você precisaria criar hierarquias tão restritas?
Imagine que você está criando um aplicativo que auxilia os usuários nas atividades de mecânica. Dependendo do tipo de carro, um mecânico pode precisar fazer diferentes atividades. Você pode modelar a hierarquia dos carros da seguinte maneira:
O código a seguir pode ser usado para utilizar essa hierarquia:
O código anterior tem dois problemas:
- Não há uma maneira direta de controlar a hierarquia da classe pública Plant ou de restringi-la a classes específicas. Você pode precisar dessa restrição para alinhar o código com um caso de uso de negócios (por exemplo, se esse aplicativo deve funcionar apenas com um tipo específico de fábrica).
- Há uma suposição com a qual os desenvolvedores precisam lidar na última construção else, que é definir ações mesmo tendo certeza de que todos os tipos possíveis de parâmetros do método já foram abordados. No código anterior, o código no último bloco else pode parecer inacessível agora, mas o que acontecerá se algum outro desenvolvedor adicionar uma classe a essa hierarquia? Além disso, o compilador não pode ajudar o processo do método a verificar se ele tratou todas as subclasses.
Classes seladas podem ajudar impondo restrições nas hierarquias de classes no nível do idioma.
Com o modificador Seal, você pode declarar uma classe como uma classe selada. Uma classe selada pode fornecer uma cláusula de permissão que lista as classes que a estendem diretamente. Se uma classe não aparecer nesta lista, não é permitido estender a classe selada. Sabendo disso, vamos refazer o código anterior.
Existem três tipos de classes que podem estender uma classe selada: final, não selada e selada. Você provavelmente está acostumado a trabalhar com classes finais, que impedem que qualquer outra classe as estenda ainda mais. As classes não seladas são bastante interessantes: quando uma classe derivada é declarada como não selada, ela pode ser estendida por qualquer outra classe; em outras palavras, esta parte da hierarquia está aberta à extensão. Não perca que a classe base ainda possui uma lista exaustiva de suas subclasses imediatas. Quando uma classe derivada é definida como uma classe selada, ela deve seguir as mesmas regras de uma classe base selada.
Agora com essas novas modificações é possível combinar com o switch pattern e outras features da linguagem e resolver de forma sucinta e elegante os problemas acima apresentados.
Records
Apesar de ter surgido em versões anteriores os records se consolidaram no Java 17 sendo um alternativa muito poderosa para o uso de classes, vamos entender o que são records
Como um ENUM, um RECORD é uma forma restrita de uma classe. É ideal para “portadores de dados simples”, classes que contêm dados que não devem ser alterados e apenas os métodos mais fundamentais, como construtores e acessadores.
Os Records funcionam como um Tupla real possibilitando alta performance e transporte imutável dos dados.
Outras features do Java 17
Além das novidades que apresentamos, também foram realizadas melhorias em performance e eficiência para JVM e as variações.
A página do release da versão Java 17 traz mais detalhes do que está por vir e sobre o que já está disponível.
Vale observar que a Oracle fornecerá suporte de 8 anos para o lançamento com atualizações de segurança, desempenho e correção.
Conforme a nota de lançamento, divulgada pela marca, o próximo LTS será o Java 21 planejado para setembro de 2023. Isso muda o círculo de lançamento do LTS para a cada dois ou três anos.
Quanto tempo leva para aprender Java?
O processo de aprendizagem do Java é algo contínuo e evolutivo, com a dedicação e o esforço correto os primeiros programas simples começam a sair em torno de 6 meses, entretanto ele nunca tem um fim. Os níveis de senioridade tendem a variar de pessoa para pessoa, exigindo uma mescla de conhecimentos práticos e teóricos. Infelizmente não há uma “receita de bolo” para evoluir na senioridade, mas existem boas práticas que devem ser seguidas, e isso pode variar devido ao seu contexto atual.
Quer mais dicas sobre o aprendizado de Java? Aproveite para ler: Especialista Java: Como se tornar um?