Palavra-chave permits

A palavra-chave permits foi introduzida no Java 15 como parte da implementação de classes seladas (sealed classes). Ela é usada em conjunto com a palavra-chave sealed para controlar quais classes ou interfaces podem estender ou implementar uma classe selada.

O que são sealed classes?

As sealed classes permitem que você restrinja quais outras classes podem herdar ou implementar uma classe ou interface. Isso é útil para manter um controle mais rigoroso sobre a hierarquia de classes, permitindo apenas um conjunto bem definido de subclasses.

Sintaxe básica:





public sealed class ClassePai permits Subclasse1, Subclasse2 {
    // Corpo da classe
}

Explicação:

  • A palavra-chave sealed indica que a classe ClassePai é selada.
  • A palavra-chave permits lista explicitamente as classes que podem estender a ClassePai. Neste caso, apenas Subclasse1 e Subclasse2 podem herdar de ClassePai.

Exemplo completo:





// Classe selada
public sealed class Forma permits Circulo, Retangulo { 
    // membros da classe
}

// Subclasse permitida
public final class Circulo extends Forma {
    // membros da classe Circulo
}

// Subclasse permitida
public final class Retangulo extends Forma {
    // membros da classe Retangulo
}

Nesse exemplo:

  • A classe Forma é selada e apenas Circulo e Retangulo podem estender Forma.
  • As subclasses Circulo e Retangulo são final, o que significa que não podem ser estendidas ainda mais.

Regras importantes:

  • Subclasses de uma classe selada devem ser uma das seguintes:
    1. final: A classe é final e não pode ser estendida.
    2. sealed: A subclasse pode ser selada novamente, controlando quais classes podem estendê-la.
    3. non-sealed: A subclasse é aberta, permitindo que outras classes a estendam livremente.

Exemplo com diferentes tipos de subclasses:





public sealed class Animal permits Cachorro, Gato, Pássaro {
    // membros da classe
}

public final class Cachorro extends Animal {
    // classe final, não pode ser estendida
}

public sealed class Gato extends Animal permits Siames, Persa {
    // classe selada, apenas Siames e Persa podem herdar
}

public non-sealed class Pássaro extends Animal {
    // classe não selada, qualquer classe pode estender
}

Nesse exemplo:

  • Cachorro é final e não pode ser estendida.
  • Gato é selada novamente, limitando suas subclasses a Siames e Persa.
  • Pássaro é não selada, permitindo que qualquer classe futura herde de Pássaro.

Quando usar:

  • sealed e permits são úteis quando você deseja manter um controle sobre quais classes podem herdar de uma classe, garantindo que a hierarquia permaneça previsível e bem definida.

Essas restrições de herança fornecem maior controle e segurança sobre a hierarquia de classes, o que pode ajudar a reduzir erros e comportamentos inesperados no código.