No dia 14/09/2021, foi lançada a versão 17 do Java, sendo ela uma versão LTS (Long Term Support). Assim como nas últimas versões, a 17 trouxe algumas features bem divertidas. Minha ideia nesse post é mostrar as duas que mais me chamaram atenção, que são a 409:Sealed Classes e a 406:Pattern Matching for Switch.
Sealed Classes
Sealed classes e interfaces restringem quais outras classes ou interfaces devem estendê-las e/ou implementa-las. O objetivo é permitir que o autor da classe ou interface tenha mais controle sobre a mesma, além de prover um jeito mais declarativo de restringir o uso da super classe. Um outro objetivo é o suporte a pattern matchings.
public abstract sealed class Automovel
permits com.exemplo.automovel.Carro,
com.examplo.automovel.Moto { ... }
Uma vez que eu defino quais classes irão poder estender de Automovel, qualquer outra classe diferente de Carro e Moto não deve ser permitida. É importante ressaltar, que as classes que irão estender uma sealed class, deverão estar no mesmo módulo, caso esteja usando JPMS (Java Platform Module System) ou no mesmo pacote, caso não esteja usando JPMS. Para a classes que estendem, existem algumas regras. São elas:
Uma subclasse deve ser declarada como final para manter a hierarquia.
Uma subclasse deve ser declarada como sealed e permitir a extensão de um novo conjunto de classes.
Uma subclasse deve ser declarada como non-sealed e assim permitir que qualquer classe a estenda.
Pattern Matching for Switch
Estender a correspondência de padrões para switch permite que uma expressão seja testada em relação a vários padrões, cada um com uma ação específica, de forma que consultas complexas orientadas a dados possam ser expressas de forma concisa e segura. O objetivo é melhorar a expressividade e a aplicabilidade das extensões e instruções switch, além de certificar que todas as expressões e instruções existentes continuem a compilar sem alterações.
static void printarTipoAutomovel(Automovel automovel) {
switch(automovel) {
case Carro -> System.out.println("É um carro");
case Moto -> System.out.println("É uma moto");
default -> System.out.println("Automóvel não identificado");
}
}
É importante ressaltar que a JEP 406: Pattern Matching for switch está como preview, o que significa que ela pode ser retirada e não fazer parte das próximas versões do Java.
Concluindo
O objetivo do post era trazer as features que mais me interessaram no Java 17, sendo essa uma escolha totalmente pessoal. Existem muitas outras features legais, que podem ser vistas em: https://openjdk.java.net/projects/jdk/17/. Espero que gostem da leitura. Dúvidas, sugestões e/ou críticas, estou à disposição.
Referências
https://openjdk.java.net/jeps/409
https://openjdk.java.net/jeps/406
Top comments (10)
Ótimo conteúdo, como sempre..
Valeu, Daniel. Abraço!!
É bem legal mesmo essas features!!!! Que massa!!!
Gostei muito, Max ... E pensar que tem tantas outras hahaha!!
Show de bola João.
Parabéns pelo post
Valeu, André. Grande abraço!!
Congratulations.
Thank's ma friend!
Excelente abordagem. Parabéns
Obrigado, Lukas!! Abraço!!