Language Средний

Ограничить, какие классы могут расширять тип — для исчерпывающих 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 17 LTS (сент. 2021)

Запечатанные классы определяют закрытое множество подтипов. Компилятор знает все возможные случаи и позволяет использовать исчерпывающий pattern matching без ветки default. В сочетании с записями они моделируют алгебраические типы данных.