Что делает модификатор sealed у класса или интерфейса?
- Зачем нужны sealed-классы?
- Что такое pattern matching для switch?
- Что такое sealed class/interface?
sealed ограничивает список наследников: наследовать или реализовывать могут только перечисленные в permits типы.
- Набор вариантов закрыт и известен компилятору
- Вместе с pattern matching в switch компилятор проверяет, что разобраны все варианты
А ещё Наследник должен быть final, sealed или non-sealed
Подробно
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 ухудшит расширяемость?
Разбор темы
- Sealed-типы и pattern matching
Закрытые иерархии через sealed, pattern matching в instanceof и switch, деконструкция записей и проверка исчерпываемости.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.