Introdução
Na evolução constante da linguagem Java, a introdução das sealed classes and interfaces representa um passo significativo no que tange ao controle de hierarquias de classes e interfaces. Esta funcionalidade, introduzida no Java 17, como parte da JEP 409, tem como objetivo principal proporcionar uma maneira mais granular de controlar o acesso e a formação de subtipos de uma determinada classe ou interface, restringindo quais classes ou interfaces podem ser subtipos de uma entidade específica, resultando em um sistema de tipos mais seguro e um código mais expressivo.
Neste artigo, exploraremos as sealed classes e interfaces, desvendando os princípios que orientam seu uso e as razões por trás de sua criação. Discutiremos as vantagens trazidas por este recurso, como ele contribui para a segurança e a manutenção do código, e como você pode aplicá-lo em seus projetos.
O que são Sealed Classes e Interfaces?
Uma sealed class ou sealed interface é aquela que restringe quais outras interfaces ou classes podem implementá-la ou estendê-la. Ao definir uma interface como selada, o desenvolvedor pode especificar exatamente quais classes têm permissão para serem subtipos dessa interface. Isso é realizado utilizando duas novas palavras-chave: sealed e permits.
Palavras-chave: final, sealed, non-sealed
Quando trabalhamos com classes e interfaces seladas, três palavras-chave são essenciais: final, sealed e non-sealed.
sealed: A palavra-chavesealedé usada para indicar que a classe ou interface só pode ser estendida ou implementada por um conjunto específico de classes ou interfaces, o qual deve ser explicitamente declarado.final: Uma classe marcada comofinalé uma declaração de que ela não pode ser estendida. Em uma interface selada, se uma classe implementadora é marcada comofinal, isso significa que a cadeia de herança termina com essa classe.non-sealed: O modificadornon-sealedé usado para indicar que, embora a classe ou interface seja parte de uma hierarquia selada, ela não impõe restrições adicionais sobre quais classes podem estender ou implementá-la. Isto introduz flexibilidade dentro de uma hierarquia de classes controlada.
Por que foram adicionadas?
- Manutenção de Código: Restringe o uso de interfaces a um conjunto conhecido de subtipos, facilitando a manutenção e evolução do código.
- Segurança: Previne que o código de fora de um módulo ou pacote crie subtipos inesperados, o que pode ser importante para preservar invariantes de segurança.
- Documentação: Serve como documentação explícita do design de uma API, indicando as intenções claras sobre como uma interface deve ser usada.
Exemplos de Uso
Vejamos um exemplo simples que demonstra a definição e utilização de uma interface selada no Java.
public sealed interface Veiculo permits Carro, Caminhao, Motocicleta {
void ligar();
}
public final class Carro implements Veiculo {
@Override
public void ligar() {
}
}
public final class Caminhao implements Veiculo {
@Override
public void ligar() {
}
}
public non-sealed class Motocicleta implements Veiculo {
@Override
public void ligar() {
}
}
Neste exemplo, Veiculo é uma interface selada que permite implementações somente pelas classes Carro, Caminhao e Motocicleta. A classe Motocicleta é marcada como non-sealed, o que significa que outras classes podem estender Motocicleta, mantendo uma certa flexibilidade na hierarquia.
Além disso, o Java oferece a flexibilidade de definir classes seladas. No exemplo a seguir, ilustramos essa capacidade através da declaração da classe Veiculo como selada, estabelecendo um controle rigoroso sobre sua extensibilidade.
public sealed class Veiculo permits Carro, Caminhao, Motocicleta {
public void ligar() {
}
}
Pattern Matching
O pattern matching com switch é uma característica poderosa do Java que combina muito bem com sealed classes e interfaces, pois permite que você faça verificações de tipo e cast de maneira mais elegante e segura. Para uma discussão mais aprofundada sobre o pattern matching com switch, confira nosso post sobre Record Patterns e Pattern Matching onde exploramos em detalhe as possibilidades que este recurso abre para o desenvolvimento em Java.
Conclusão
As interfaces e classes seladas fornecem um método robusto para os desenvolvedores Java definirem hierarquias de classe e interface com intenções claras. As palavras-chave final, sealed, e non-sealed são ferramentas poderosas que, usadas corretamente, podem ajudar a criar uma base de código mais segura, manutenível e expressiva.
Espero que este artigo tenha fornecido uma compreensão clara do que são classes e interfaces seladas, por que foram introduzidas e como podem ser aplicadas no Java. Ao incorporar esse recurso em seus projetos, você estará aproveitando as vantagens que ele oferece para a estruturação de sistemas robustos e bem definidos.
Pronto para turbinar 🚀 seu código com as Sealed Classes em Java? Não pare por aqui!
- 👉 Deixe um comentário abaixo com suas dúvidas ou insights. Vamos aprender juntos!
- 📢 Compartilhe este artigo com sua rede e ajude a espalhar conhecimento!
- 🔔 Siga para mais dicas valiosas e mantenha-se atualizado com as últimas tendências em Java!
Sua jornada para um código mais seguro e eficiente começa agora! 🌟
Referências de Livros para Entrevistas
- 📗 Cracking the Coding Interview’ é um best-seller renomado e um favorito pessoal – um livro indispensável na preparação para entrevistas técnicas!
- 📙 Designing Data-Intensive Applications: é uma referência para criar aplicações escaláveis, robustas e de alto desempenho!
Pingback: Java 21: Codifique com Emoção Usando o Novo Suporte a Emojis - A Arte de Programar