Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.