Cláusula permits
Liste os subtipos permitidos.
Cláusula permits é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
A Cláusula permits
A cláusula permits é a forma como um tipo selado nomeia seus subtipos permitidos. Ela vem logo depois do nome do tipo e da palavra-chave permits.
Sintaxe Básica
Liste os subtipos permitidos, separados por vírgulas, depois de permits.
public class Main {
sealed interface Vehicle permits Car, Truck, Motorcycle {}
record Car() implements Vehicle {}
record Truck() implements Vehicle {}
record Motorcycle() implements Vehicle {}
public static void main(String[] args) {
Vehicle v = new Truck();
System.out.println(v.getClass().getSimpleName());
}
}Implementando o Contrato
Cada subtipo nomeado deve realmente implements (para interfaces) ou extends (para classes) o tipo selado. Nomear em permits uma classe que não faça isso gera um erro de compilação.
Omitindo permits
Se todos os subtipos permitidos forem declarados no mesmo arquivo que o tipo selado, você poderá omitir permits por completo. O compilador deduz a lista automaticamente.
public class Main {
sealed interface Status {}
record Active() implements Status {}
record Inactive() implements Status {}
public static void main(String[] args) {
Status s = new Active();
System.out.println(s.getClass().getSimpleName());
}
}Quando permits É Necessário
Se os subtipos estiverem em arquivos separados dentro do mesmo pacote ou módulo, você deverá listá-los explicitamente em permits. O compilador não consegue deduzir a lista entre arquivos.
A Ordem Não Importa
A ordem dos nomes em permits não tem significado semântico. Ela não afeta o comportamento da seleção nem qualquer outra coisa; é apenas uma lista de tipos permitidos.
Uma Hierarquia de Classes com permits
A mesma cláusula funciona para classes seladas com comportamento abstract.
public class Main {
sealed static abstract class Node permits Leaf, Branch {
abstract int size();
}
static final class Leaf extends Node {
int size() { return 1; }
}
static final class Branch extends Node {
final Node a, b;
Branch(Node a, Node b) { this.a = a; this.b = b; }
int size() { return a.size() + b.size(); }
}
public static void main(String[] args) {
Node tree = new Branch(new Leaf(), new Branch(new Leaf(), new Leaf()));
System.out.println("Leaves: " + tree.size());
}
}Esquecendo um Subtipo
Se uma classe implementar a interface selada, mas estiver ausente de permits, a compilação falhará com uma mensagem informando que a classe não tem permissão para estender o tipo selado.
Tipos Permitidos São Conhecidos Publicamente
A lista permits faz parte do contrato do tipo e é registrada no arquivo da classe. As ferramentas e o compilador podem lê-la para conhecer o conjunto completo de subtipos.
Combinando Subtipos Finais e Selados
Uma lista permits pode combinar modificadores: alguns subtipos podem ser final, enquanto outros podem ser sealed para continuar a hierarquia em níveis mais profundos.
public class Main {
sealed interface Shape permits Circle, Polygon {}
record Circle(double r) implements Shape {}
sealed interface Polygon extends Shape permits Triangle, Rectangle {}
record Triangle() implements Polygon {}
record Rectangle() implements Polygon {}
public static void main(String[] args) {
Shape s = new Triangle();
System.out.println(s instanceof Polygon);
}
}Práticas Recomendadas
Mantenha o tipo selado e seus subtipos próximos para facilitar a leitura. Prefira omitir permits em hierarquias pequenas de um único arquivo e liste os subtipos explicitamente quando os arquivos forem separados.
Verificação Rápida
Teste sua compreensão sobre a cláusula permits.
Recapitulação
Você aprendeu sobre a cláusula permits.
- Ela lista os subtipos permitidos depois do nome do tipo selado.
- Cada tipo listado deve estender ou implementar o tipo selado.
- Ela pode ser omitida quando todos os subtipos compartilham o mesmo arquivo.
- Os próprios subtipos podem ser selados para estender a hierarquia.
Perguntas Frequentes
A aula “Cláusula permits” é grátis?
Sim — o texto completo de “Cláusula permits” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Cláusula permits”?
Liste os subtipos permitidos. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Cláusula permits”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Declarando tipos selados
- Cláusula permits
- Tipos selados com registros
- switch exaustivo sobre tipos selados