Switch exaustivo sem default
O compilador verifica que todos os subtipos sealed estão cobertos — sem necessidade de default.
Comparação de Código
✕ Java 8
// Must add default even though
// all cases are covered
double area(Shape s) {
if (s instanceof Circle c)
return Math.PI * c.r() * c.r();
else if (s instanceof Rect r)
return r.w() * r.h();
else throw new IAE();
}
✓ Java 21+
// sealed Shape permits Circle, Rect
double area(Shape s) {
return switch (s) {
case Circle c ->
Math.PI * c.r() * c.r();
case Rect r ->
r.w() * r.h();
}; // no default needed!
}
Viu um problema com este código? Nos avise.
Por que a forma moderna ganha
Segurança em tempo de compilação
Adicione um novo subtipo e o compilador mostra cada lugar a ser atualizado.
Sem código morto
Sem branch default inalcançável que mascara bugs.
Tipos algébricos
sealed + records + switch exaustivo = ADTs completos em Java.
Abordagem Antiga
Default obrigatório
Abordagem Moderna
Exaustividade com sealed
Desde o JDK
21
Dificuldade
Intermediário
Suporte JDK
Switch exaustivo sem default
Disponível
Amplamente disponível desde o JDK 21 LTS (set 2023)
Como funciona
Ao fazer switch sobre um tipo sealed, o compilador conhece todos os subtipos possíveis e verifica que cada caso está tratado. Se você adicionar um novo subtipo, o compilador aponta cada switch que ficou incompleto.
Documentação Relacionada