Что такое sealed-классы (sealed classes) в Java и для чего они нужны?

«Что такое sealed-классы (sealed classes) в Java и для чего они нужны?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Sealed-классы (запечатанные классы) — это механизм, представленный в Java 15 (предпросмотр) и окончательно в Java 17, который позволяет строго контролировать иерархию наследования.

Для чего нужны:

  1. Ограничение наследования. Автор класса или интерфейса определяет фиксированный набор классов, которые могут его расширять/реализовывать.
  2. Моделирование точных доменных моделей. Полезно для представления известных, ограниченных вариантов (например, фигуры: Circle, Square, Triangle).
  3. Улучшение читаемости и безопасность кода. Компилятор знает все возможные подтипы, что позволяет использовать исчерпывающие проверки в switch-выражениях (Java 17+) без блока default.

Синтаксис:

// Объявление запечатанного интерфейса с разрешенными реализациями
public sealed interface Shape permits Circle, Rectangle, Triangle {}

// Классы-наследники должны быть final, sealed или non-sealed
public final class Circle implements Shape { /*...*/ }
public non-sealed class Rectangle implements Shape { /*...*/ }
public sealed class Triangle permits EquilateralTriangle, RightTriangle {}

Ключевые модификаторы наследников:

  • final — дальнейшее наследование запрещено.
  • sealed — наследование разрешено, но тоже для ограниченного круга классов.
  • non-sealed — класс открыт для неограниченного наследования ("снимает печать").