sealed / permits
Ограничивает список классов, которым разрешено наследоваться от класса или реализовывать интерфейс.
Доступно с: Java 17
Синтаксис
sealed interface Name permits A, B { }Примеры
Закрытая иерархия и switch без default:
sealed interface Shape permits Circle, Rect {}
record Circle(double r) implements Shape {}
record Rect(double w, double h) implements Shape {}
double area(Shape s) {
return switch (s) {
case Circle c -> Math.PI * c.r() * c.r();
case Rect r -> r.w() * r.h();
};
}
void main() {
IO.println(area(new Rect(2, 3)));
}Результат:
6.0Примечания
Каждый разрешённый наследник должен быть final, sealed или non-sealed (записи и enum уже final). Если наследники в том же файле, permits можно не писать — компилятор найдёт их сам.
Главная польза — компилятор знает все варианты: switch по такому типу не требует default, а при добавлении нового наследника сообщит обо всех местах, где его надо обработать.
См. также
- switch — Выбирает ветку по значению; в форме выражения возвращает результат.
- record — Объявляет запись — неизменяемый класс для хранения данных с готовыми equals(), hashCode() и toString().
- interface — Объявляет интерфейс — набор методов, которые обязуется реализовать класс.
- final — Запрещает менять переменную после присваивания, переопределять метод или наследовать класс.
В учебнике
- Запечатанные классы — Запечатанные классы и интерфейсы в Java: sealed, permits, final и non-sealed подклассы и switch без ветки default.