Запечатанные классы для иерархий типов
Ограничить, какие классы могут расширять тип — для исчерпывающих switch.
Сравнение кода
✕ Java 8
// Anyone can extend Shape
public abstract class Shape { }
public class Circle extends Shape { }
public class Rect extends Shape { }
// unknown subclasses possible
✓ Java 17+
public sealed interface Shape
permits Circle, Rect {}
public record Circle(double r)
implements Shape {}
public record Rect(double w, double h)
implements Shape {}
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Контролируемая иерархия
Расширять могут только разрешённые подтипы — никаких неожиданных подклассов.
Исчерпывающее сопоставление
Компилятор проверяет, что switch охватывает все случаи — default не нужен.
Алгебраические типы данных
Естественное моделирование типов-сумм — sealed + records = ADT в Java.
Старый подход
Открытая иерархия
Современный подход
sealed permits
Начиная с JDK
17
Сложность
Средний
Поддержка JDK
Запечатанные классы для иерархий типов
Доступно
Доступно в JDK 17 LTS (сент. 2021)
Как это работает
Запечатанные классы определяют закрытое множество подтипов. Компилятор знает все возможные случаи и позволяет использовать исчерпывающий pattern matching без ветки default. В сочетании с записями они моделируют алгебраические типы данных.
Связанная документация
Доказательство