Palavra-chave non-sealed

A palavra-chave non-sealed foi introduzida no Java 17 como parte do aprimoramento do suporte à herança de classes e trabalha em conjunto com as palavras-chave sealed e permits. Ela permite maior controle sobre quais classes podem estender uma classe sealed, sem as restrições impostas por uma classe final ou sealed.

Contexto de non-sealed:

Em Java, uma classe sealed especifica quais outras classes podem estendê-la, garantindo controle sobre a hierarquia de herança. No entanto, se você quiser permitir que outras classes herdem de uma das subclasses de uma classe sealed, sem restringir quais classes podem fazer isso, você pode marcar a subclasse como non-sealed.

Sintaxe e Exemplo:

  1. Classe sealed: Uma classe sealed restringe as classes que podem estendê-la.
  2. Classe non-sealed: Essa subclasse pode ser estendida por qualquer outra classe sem restrições.




public sealed class Veiculo permits Carro, Caminhao { }

public final class Carro extends Veiculo { }

public non-sealed class Caminhao extends Veiculo { }

Explicação:

  • A classe Veiculo é sealed, o que significa que apenas as classes Carro e Caminhao podem estendê-la.
  • Carro é final, então nenhuma outra classe pode estender Carro.
  • Caminhao é non-sealed, o que significa que outras classes podem estendê-la livremente.

Exemplo de uma subclasse estendendo uma classe non-sealed:

public class CaminhaoPequeno extends Caminhao {
    // Corpo da classe CaminhaoPequeno
}
Aqui, CaminhaoPequeno pode herdar de Caminhao porque Caminhao é non-sealed, permitindo a extensão sem restrições.

Benefícios:

  • Flexibilidade de herança: Permite maior controle ao criar uma hierarquia de classes. Uma classe pode ser sealed para restringir herança, enquanto uma de suas subclasses pode ser non-sealed, permitindo herança livre.
  • Organização de código: Facilita o design de APIs, mantendo partes controladas da hierarquia enquanto libera outras para extensão.