Какое главное преимущество даёт sealed-иерархия при использовании switch с pattern matching?
- Что дают sealed-типы и почему в паре с pattern matching они меняют стиль кода?
Закрытый список наследников делает проверку полноты switch работой компилятора: не нужен default, а новый подтип — ошибка компиляции во всех switch, которые его не обрабатывают. Вместо молчаливого провала в default.
- Моделирование «суммы типов»: Result = Success | Failure
- Заменяет Visitor без accept-методов
- Record-паттерны разбирают компоненты: case Circle(var r) -> ...
А ещё Поведение уходит из иерархии в функции над данными — data-oriented programming
Подробно
В обычной открытой иерархии компилятор не может знать всех наследников, поэтому требует default — и добавление нового подтипа тихо проваливается в эту ветку. Sealed фиксирует список через permits, и тогда switch по типу проверяется на исчерпываемость: забыли вариант — ошибка компиляции, то есть все места, требующие правки, найдены за вас. Это сознательный размен: жертвуем открытостью к расширению (принципом OCP) ради полноты проверки. Правило применимости простое: вариантов конечное число и меняются они редко — sealed уместен; иерархия открыта для сторонних реализаций — нет.
Пример
sealed interface Shape permits Circle, Square {}
record Circle(double r) implements Shape {}
record Square(double side) implements Shape {}
double area(Shape s) {
return switch (s) {
case Circle(var r) -> Math.PI * r * r;
case Square(var a) -> a * a;
}; // default не нужен
}Что хотят услышать
- Исчерпываемость без default.
- Пример алгебраического типа.
- Связь с заменой Visitor.
Частые ошибки
- Добавлять default в исчерпывающий switch по sealed-типу — это возвращает молчаливое поведение при добавлении варианта.
- Применять sealed к иерархии, которую расширяют потребители библиотеки.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Компилятор знает всех наследников и проверяет исчерпываемость switch без ветки default
- ✗Ускоряется диспетчеризация вызовов за счёт отказа от виртуальных методов
- ✗Наследники автоматически получают реализацию equals и hashCode
- ✗Все наследники становятся неизменяемыми
Что спросят дальше
- Почему sealed считают заменой паттерну Visitor?
- Что должны объявлять сами наследники sealed-типа?
- Как sealed-типы связаны с record и почему их часто используют вместе?
- Как в switch с паттернами обрабатывается null?
Разбор темы
- Sealed-типы и pattern matching
Закрытые иерархии через sealed, pattern matching в instanceof и switch, деконструкция записей и проверка исчерпываемости.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.