Получить доступ

Что делает модификатор sealed у класса или интерфейса?

JuniorСовременная JavaJava >=17
Ещё спрашивают так:
  • Зачем нужны sealed-классы?
  • Что такое pattern matching для switch?
  • Что такое sealed class/interface?
Коротко

sealed ограничивает список наследников: наследовать или реализовывать могут только перечисленные в permits типы.

  • Набор вариантов закрыт и известен компилятору
  • Вместе с pattern matching в switch компилятор проверяет, что разобраны все варианты

А ещё Наследник должен быть final, sealed или non-sealed

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

sealed (Java 17) — промежуточный вариант между открытым классом и final. Вы явно перечисляете, кто может наследоваться: sealed interface Shape permits Circle, Square, Rectangle. Каждый наследник объявляется final, sealed (дальше ограничивает) или non-sealed (снова открывает иерархию).

Главная выгода проявляется вместе с сопоставлением с образцом (pattern matching for switch, Java 21). Раз компилятор знает все варианты, switch по Shape без default проверяется на полноту: если добавить новый тип, компилятор укажет все места, где он не обработан.

Так удобно моделировать закрытые наборы состояний и результатов: результат операции «успех или ошибка», статус заказа, команды, узлы дерева выражений. Это то, что в функциональных языках называют алгебраическими типами данных; record хорошо подходит для вариантов.

Пример

sealed interface PaymentResult permits Success, Declined, Failed {}
record Success(String txId) implements PaymentResult {}
record Declined(String reason) implements PaymentResult {}
record Failed(Exception error) implements PaymentResult {}

String message(PaymentResult r) {
    return switch (r) {                 // без default — компилятор проверит полноту
        case Success s  -> "Оплачено: " + s.txId();
        case Declined d -> "Отказ: " + d.reason();
        case Failed f   -> "Ошибка, попробуйте позже";
    };
}

Что хотят услышать

  • Назначение: закрытый список наследников.
  • Требования к наследникам: final, sealed, non-sealed.
  • Связь с pattern matching и проверкой полноты switch.
  • Пример применения.

Частые ошибки

  • Путать с полным запретом наследования.
  • Применять к иерархии, которую должны расширять сторонние разработчики.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Ограничивает список типов, которым разрешено его наследовать или реализовывать
  • ✗Полностью запрещает наследование, как final
  • ✗Делает все поля класса неизменяемыми
  • ✗Скрывает класс от других пакетов

Что спросят дальше

  • Что обязан объявить о себе наследник такого типа?
  • Как это связано с проверкой полноты в switch?
  • Чем sealed полезен для switch?
  • Когда sealed ухудшит расширяемость?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем